笔试碰到了,一般不会这么复杂的定义,但是记录下:
Tips: 对于编译器来说,数组也是一种类型,所以数组指针是指向数组,这个数组可能是n维度
int (*p)[10]; // p是一个指向长度为10,类型为int的数组指针, 这个数组的内存大小为sizeof(int)*10 => 40Byte
p[9]; // p[9] 等价于 *(st_addr + 9 * 40) 此时 为一个 int param[10]; 的起始地址
// 多维数组指针
int (*p)[9][10]; // p是一个指向长款9*10, 类型为int的二维数组的 数组指针 指针所指向的每一块内存为 9*10*4 = 360Byte
函数指针
// 原始定义
int func_1(int a, int b);
// p是一个函数指针 指向返回值为int, 输入为两个int的函数
int (*p)(int, int) = func_1; // p 是 指针(函数指针)
// 定义一个包含10个函数指针的数组 // 紧紧跟在变量名后面的方括号
int (*p[10])(int, int); // p 是 数组
// 指向函数指针的指针
// 错误定义
int (*p)(int, int)[10] // 想定义数组指针, 但语法 错误, 其并不能表示定义一个数组指针指向包含10个函数指针的数组
int (*p[10])(int, int)[10] // 想定义数组, 但语法错误
// 正确定义:
int (*(*p)[10])(int, int); // p是指针(数组指针), 定义一个数组指针,指向一个包含10个函数指针的数组
int (*(*p[9])[10])(int, int); // p是数组, 表示 p 是一个包含 9 个指向包含 10 个函数指针的数组的数组
// 利用typedef 简化函数指针定义
typedef int (*FuncPtrType)(int, int);
FuncPtrType p = func_1;
// 定义一个包含10个函数指针的数组
FuncPtrType p_lis[10] = {}; // p_lis 是数组
// 定义一个数组指针, 数组里面包含10个函数指针
FuncPtrType (*p)[10]; // p是数组指针
FuncPtrType (*func_ptr)(int, int); // 来点绕的
// 感觉好绕
很绕,但是记住格式,然后把一切复杂类型视为一种类型就好理解了