void test(void){ //void能够不写 //函数体中不用写返回函数(return) }
test(int a, int b){ //返回值类型能够不写,若是不写,默认为返回int类型 }
int a = 10; //定义了一个int类型的变量 int *pa = NULL; //定义了一个int类型的指针 pa = &a; //将int类型变量a的地址赋值给pa指针,或者说pa指针指向了变量a *pa = 20; //经过指针简介修改变量a的值,*称为取消引用运算符或间接运算符
//使用char数组存储字符串,这个叫作字符串变量 char str1[] = “luoguankun”; //使用指针存储字符串,它指向字符串的首字母 //这个称为字符串常量,若是再声明一个字符串值同样的指针字符串 //那么他们会指向同一 个字符串,而不会建立一个新的 char *str2 = “luoguankun”;
int *name[5]; name[1] //取出元素下标为1的元素(指针)
//定义了一个加法函数 int sum(int a, int b){ return a+b; } //将定义好的指针指向函数 //首先声明一个指针 int (*p)(int,int); //其中(*p)表明未来指向的函数,(*p)左右分别为返回值类型和形参定义 p = sum; //将指针p指向test函数 p(10,22); //经过指针调用函数,它等于sum(10,22);固然在调用以前别忘了声明函数
数组只能存储一组同类型的数据,而结构体能够保存一组不一样类型的数据 程序员
//如下定义没有分配存储空间,仅仅定义类型 算法
struct Person { int age; int sex; char *name; };
定义结构体变量 数组
struct Person p;
p.age = 13; //一种方式 //另外一种方式,初始化的同时进行赋值,同时进行分配存储空间 //结构体的存储空间是最大成员字节数的倍数,称为补齐算法 struct Person p = {13,1,”luoguankun”}; p = {13,1,”luoguankun”}; //这是错误的!只能在定义结构体时赋值
printf(“age=%d,sex=%d,name=%s”,p.age,p.sex,p.name);
//定义类型的同时定义变量,甚至能够不写类型名称,称为匿名结构体,它不能被重用 //而且变量名不能重复 struct Student{ int age; }stu;
//定义结构体类型 struct Person{ int age; double height; char *name; }stu; //定义结构体数组变量并赋值初始化 struct Person stu[3] = { {11,12.1,"o"}, {12,12.2,"u"}, {13,12.3,”l"} }; //循环遍历结构体数组,并打印 for (int i = 0; i < sizeof(stu) / sizeof(stu[0]); i++) { printf("age=%d,height=%.1f,name=%s\n",stu[i].age,stu[i].height,stu[i].name); } //stu[i] = {4,1.22,”dkdk”}; //这是错误的 stu[i].age = 4; //这样是正确的
//省略类型定义,如上,下面使用结构体变量并赋值初始化 struct Person stu = {11, 1.73, "罗冠坤"}; //定义了一个指针p并指向结构体变量stu struct Person *p = &stu; //三种输出方法均可以输出数据,做用相同,其中p->成员名的方式较为新颖 printf("age=%d,height=%.2f,name=%s\n",stu.age,stu.height,stu.name); printf("age=%d,height=%.2f,name=%s\n",(*p).age,(*p).height,(*p).name); printf(“age=%d,height=%.2f,name=%s\n",p->age,p->height,p->name); //赋值方法的调用方法相同
int main(){ struct Date{ int year; //年 int month; //月 int day; //日 }; struct Student{ int no; //学号 //嵌套两个Date来分别表示生日和入学日期 struct Date birthday; //生日 struct Date SchoolDay; //入学日期 }; struct Student stu = { 1, {1989,10,24}, {2009, 9, 1} }; //间接取值,嵌套访问 printf("学号为:%d\n生日为:%d年%d月%d日\n入学日期为:%d年%d月%d日\n", stu.no,stu.birthday.year,stu.birthday.month,stu.birthday.day, stu.SchoolDay.year,stu.SchoolDay.month,stu.SchoolDay.day); return 0; }
//宏名 值; #define //宏的变量名所有是大写,结尾不须要写分号 #define COUNT 6 //还能够取消宏的定义 #undef COUNT
/* 必定要加括号,不然会出现意想不到的结果好比像下面这样调用 sum(10,10) * sum(10,10); 至关于下面: 10+10*10+10 这样替换事后改变了运算顺序,也就改变了预期的运算结果 因此必定要把全部变量都加上括号 再好比平方的例子必定要像下面这样写,每一个形参都要加上括号 #define Square(a)((a)*(a)) */ #define sum(v1,v2)((v1)+(v2)) int main(void){ int result = sum(11,10); printf("result=%d\n",result); //输出了21 return 0; }
#define A 10 int main(){ //条件编译判断若是用到常量值,好比下面的A //则必须得是经过宏定义的,由于在编译前已经进行了判断 //条件的括号能够省略 #if (A == 10) printf("a = 10\n"); #elif (A == 5) printf("a = 5\n"); #else printf("a is other number\n"); #endif //必定要有#endif结尾 return 0; }
当进行多文件开发时,某些函数功能,须要在.h文件中进行声明,还要将.h文件包含到某个文件中,当代码量过大时,有可能发生屡次包含,这虽然不会产生错误,可是会影响性能,因此在头文件中能够利用条件编译,防止屡次包含头文件,例如像下面这样定义头文件: 函数
/* 解释下面的写法的逻辑: 若是没有定义宏 ABC 那么就定义一个宏ABC 而且声明sum()函数 若是第二次被包含时,一样会进行判断 此时判断的条件不成立,由于第一次被包含时已经建立了宏变量ABC 因此这样一来,避免了重复包含同一个头文件 ABC宏名称不能和别的头文件中的冲突!因此通常使用当前.h头文件名称命名 */ // #ifndef等同于#if !define,对应的有#ifdef 等同于 #if define #ifndef ABC // ABC通常写成当前头文件的名称,后面的值随便写 #define ABC 11 int sum(int,int); #endif
//须要分号 typedef int MyInt; int main(){ //声明别名后,能够这样定义int类型变量 MyInt i = 10; }
//给指针类型起了一个别名String type char* String; int main(){ String = “luoguankun”; }
//定义了一个结构体类型Student struct Student { int age; }; //给结构体Student起了个别名叫作Mystu typedef struct Student MyStu; //或者像下面这样,在定义结构体类型的时候直接起别名,这样更加精简 typedef struct Student { int age; }MyStu; //若是像上面这样给结构体起了别名,定义结构体变量就变成了下面这样: MyStu s1; MyStu s2; MyStu s3; //还有一种是没有类型名的结构体 //下面的结构体不能使用本来的方式建立结构体变量 //只能经过下面的方式建立结构体变量,没法用struct Student stu = {10};这种方式建立结构体变量, //而前面几种两种建立结构体变量的方式均可以 //而这个只能像下面这样建立: //MyStu stu; typedef struct { int age; }MyStu;
//如下是没有使用typedef定义别名时的枚举使用 enum Sex {Man, Woman}; enum Sex s = Man; //如下是使用typedef定义别名后的使用方法 typedef enum Sex MySex; MySex s = man; //还能够在定义枚举类型的同时定义别名(推荐这样定义) typedef enum Sex {Man, Woman} MySex; MySex s1 = man;
//定义一个函数 int sum(int a, int b){ return a+b; }
//指向上面函数的指针声明和调用 int (*p)(int, int) = sum; int result = p(10,20); //使用typedef为指向函数的指针定义别名 typedef int (*MyPoint)(int, int); MyPoint p = sum; int result = p(20,20);
//简化前 struct Person{ int age; }; struct Person p = {20}; struct Person *p2 = &p; printf("age = %d\n”, p2->age); //简化后 typedef struct Person{ int age; } *PersonPoint; struct Person p = {20}; PersonPoint p2 = &p; printf("age = %d\n", p2->age);
6、static对局部变量的做用 性能