基础

发布时间 2023-07-23 20:00:27作者: 宗哲

1.环境设置/程序结构/基本语法

2.数据类型/变量/常量

3.存储类/运算符/判断/循环/函数/作用域规则

4.数组

5.enum(枚举)/字符串

 (1)enum是一种弄基本的数据类型,用于定义一组具有离散值的常量。枚举类型通常用于为程序中的一组相关的常量取名字,以便于程序的可读性和维护性。

枚举语法定义格式:

enum 枚举名 {枚举元素1,枚举元素2,...};

注意:第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。我们在这个实例中把第一个枚举成员的值定义为 1,第二个就为 2,以此类推。

enum DAY
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
};

枚举变量的定义

(1)先定义枚举类型,再定义枚举变量

enum DAY
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY day;

(2)定义枚举类型的同时定义枚举变量

enum DAY
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;

(3)省略枚举名称,直接定义枚举变量

enum
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;

例1:

#include <stdio.h>
enum season {spring, summer=3, autumn, winter};
int main()
{
    enum season sea=spring;
    printf("%d",sea);
    return 0;
}

例2:

#include <stdio.h>
 
enum DAY
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
};
int main()
{
    enum DAY day;
    day = WED;
    printf("%d",day);
    return 0;
}

枚举是连续的是可以进行遍历的:

#include <stdio.h>
 
enum DAY
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;
int main()
{
    // 遍历枚举元素
    for (day = MON; day <= SUN; day++) {
        printf("枚举元素:%d \n", day);
    }
}

但是不连续是不可以进行遍历的:

enum
{
    ENUM_0,
    ENUM_10 = 10,
    ENUM_11
};

例:在switch中的应用

#include <stdio.h>
#include <stdlib.h>
int main()
{
    enum color { red=1, green, blue };
    enum  color favorite_color;
    /* 用户输入数字来选择颜色 */
    printf("请输入你喜欢的颜色: (1. red, 2. green, 3. blue): ");
    scanf("%u", &favorite_color);
 
    /* 输出结果 */
    switch (favorite_color)
    {
    case red:
        printf("你喜欢的颜色是红色");
        break;
    case green:
        printf("你喜欢的颜色是绿色");
        break;
    case blue:
        printf("你喜欢的颜色是蓝色");
        break;
    default:
        printf("你没有选择你喜欢的颜色");
    }
    return 0;
}

例:将枚举类型转换为整数

#include <stdio.h>
#include <stdlib.h>
int main()
{
    enum day
    {
        saturday,
        sunday,
        monday,
        tuesday,
        wednesday,
        thursday,
        friday
    } workday;
    int a=1;
    enum day weekend;
    weekend = ( enum day ) a;  //类型转换
    //weekend = a; //错误
    printf("weekend:%d",weekend);
    return 0;
}

(2)字符串

字符串实际上是使用空字符 \0 结尾的一维字符数组。因此,\0 是用于标记字符串的结束。

空字符(Null character)又称结束符,缩写 NUL,是一个数值为 0 的控制字符,\0 是转义字符,意思是告诉编译器,这不是字符 0,而是空字符。

例:

char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'};

依据数组初始化规则,您可以把上面的语句写成以下语句:

char site[] = "RUNOOB";

例:

#include<stdio.h>
int main()
{
    char site[7]={'R','U','N','O','O','B','\0'};
    printf("%s",site);
    return 0;
}

C 中有大量操作字符串的函数:

(1)strcpy(s1, s2);             复制字符串 s2 到字符串 s1。

(2)strcat(s1, s2);              连接字符串 s2 到字符串 s1 的末尾。

(3)strlen(s1);                    返回字符串 s1 的长度。

(4)strcmp(s1, s2);            如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。

(5)strchr(s1, ch);              返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。

(6)strstr(s1, s2);               返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。

#include <stdio.h>
#include <string.h>
 
int main ()
{
   char str1[14] = "runoob";
   char str2[14] = "google";
   char str3[14];
   int  len ;
 
   /* 复制 str1 到 str3 */
   strcpy(str3, str1);
   printf("strcpy( str3, str1) :  %s\n", str3 );
 
   /* 连接 str1 和 str2 */
   strcat( str1, str2);
   printf("strcat( str1, str2):   %s\n", str1 );
 
   /* 连接后,str1 的总长度 */
   len = strlen(str1);
   printf("strlen(str1) :  %d\n", len );
 
   return 0;
}

6.结构体

 

 

7.指针/函数指针与回调函数

如动态内存分配,没有指针是无法执行的。

每一个变量都有一个内存位置,每一个内存位置都定义了可使用 & 运算符访问的地址,它表示了在内存中的一个地址。

以下是有效的指针声明:

int    *ip;    /* 一个整型的指针 */
double *dp;    /* 一个 double 型的指针 */
float  *fp;    /* 一个浮点型的指针 */
char   *ch;    /* 一个字符型的指针 */

例:

#include <stdio.h>
 
int main ()
{
   int  var = 20;   /* 实际变量的声明 */
   int  *ip;        /* 指针变量的声明 */
 
   ip = &var;  /* 在指针变量中存储 var 的地址 */
 
   printf("var 变量的地址: %p\n", &var  );
 
   /* 在指针变量中存储的地址 */
   printf("ip 变量存储的地址: %p\n", ip );
 
   /* 使用指针访问值 */
   printf("*ip 变量的值: %d\n", *ip );
 
   return 0;
}

 空指针:

#include <stdio.h>
 
int main ()
{
   int  *ptr = NULL;
 
   printf("ptr 的地址是 %p\n", ptr  );
 
   return 0;
}

 

 

 

8.共用体

 

9.位域/typedef/输入输出

 

文件读写/预处理器/头文件

 

11.强制类型转换/错误处理

12.递归/可变参数

 

13.内存管理

 

14.命令行参数