- 如果*p被()包住,说明指针变量p将来指向的是函数
//声明一个指针变量 //int (*p)(int, int) = sum; int (*p)(int, int); p = sum; // 如果*p被()包住,说明指针变量p将来指向的是函数 // 最左边的void说明p指向的函数没有返回值 // 最右边的()说明p指向的函数没有形参 void (*p)(); // 函数名test就是test函数的地址 // 将test函数的地址赋值给了指针变量p // 指针变量p成功指向了test函数 p = test; // 利用指针变量p间接调用了test函数 //(*p)(); //test(); p();
- 结构体占用的空间大小
默认情况下,一个结构体变量所占有的存储空间是所有成员的总和。
sizeof计算的结构体所占用存储空间时,返回的值必须是最大成员的倍数。
- 结构体的省略写法
省略了结构体的名称,这种方法没有重用性。
在结构图的最后加入的内容是 同时定义的变量。
struct { double width; double height; } s;
注意: 如果想给结构体使用{}的方式一次性赋值,只能在定义变量的同事进行。
- 结构体作为函数参数时,只是成员的值传递(修改函数内部的结构体,并不影响外面的结构体)
struct Person { int age; }; // 这种方式是值传递, 不会真的改变nochange的值 void changePersonWithAge1(struct Person nochange) { nochange.age = 100; } // 这种传递的是指针,指针指向同一个内容,可以真正改变 void changePersonWithAge2(struct Person *change) { // (*change).age = 100; change->age = 100; // 等价于上面那行。 } int main() { struct Person p1 = {5}; // changePersonWithAge1(p1); changePersonWithAge2(&p1); // 引用传递,要传递指针 printf("%d\n", p1.age); }
- 宏定义:
#define 宏名 值
#undef 宏名
作用:宏替换,在翻译之前,将代码中的所有宏名都替换成对应的值。
宏名最好都用大写,跟函数区分开。可以使用在任何地方(代码段中,头部,任何地方)
// 带参数的宏定义 // 宏替换只是纯粹的文本替换,把左边的宏换成右边的东西,并不会进行任何运算 // 参数和结构都必须用()包住 #define PING_FANG(x) ((x)*(x))
- 预处理指令
不能递归包含: 自己包含自己,a.h include a.h
不能交叉包含:a.h incldue b.h, b.h include a.h
防止.h的文件内容被包含多次。用预处理命令。 文件名用A_H的方式来定义。
#ifndef 文件名 #define 文件名 ..文件内容.. #endif
- typedef 起别名
typedef int Myint
typedef char * String1
struct Person { int age; }; // 给结构体类型起个别名 :Stu typedef struct Person Student; // 此结构类似与上面的内容。 是上面两行的缩写 typedef struct Dog { int age } WangCai;
- 指针的使用范围
需要间接的修改某个变量的值。