C Language Pointer
基本概念
int * 指向一个int类型变量
int ** 指向一个int *类型指针
void * 任何类型的指针都可以转化成空类型指针,但是空类型指针不能进行指针操作如
ptr+1; *ptr
64位系统的指针是8个字节大小,32位是4字节,16位的像8086系统或51单片机的8位系统的指针是2个字节
复杂指针类型的解读
int *ptr[10] 这里的ptr是一个存放int *指针的数组
int (*ptr)[10] 这里的ptr是一个指向int [10]数组的指针
int (*ptr)(double) 这里的ptr是一个指向 int fn(double)函数的指针
更复杂的类型组合解读规则:从变量名开始,先往右看再往左看
遇到[]: 说明这是一个数组;
遇到(): 说明这是一个函数;
遇到*: 说明这是一个指针;
遇到(...): 括号会改变优先级,先处理括号内的。
例子:void (*(*f[])())()
可以解读为:f是数组,里面存放void *指针,里面的指针指向一个void * fn()函数,函数返回的指针指向一个void fn()函数。
这个例子就引出另一个重要概念:基底类型。上面的例子中的基底类型是void
编译器扫描类型是从左往右进行,扫描到void,确定类型为void,后面的所有指针关联的数据类型都是void.
基底类型只能有一个,更加不能使用强制类型转换这种表达式才能使用的东西。
基底类型可以是基本类型,也可以是任何自定义的类型