深度理解指针
指针
指针是什么? 就一句话,指针就是地址。指针里面存的是地址而不是像int、char等里面存的是具体的值,而对指针里的地址解引用之后才可以得到具体的值
指针数组
int *p1[10];
操作符“[]”的优先级比“*”高,所以p1先和“[]”结合,形成数组,之后这个数组再和“*”结合,形成指针数组。换句话说,在上述定义里面,p1是一个数组,只不过这个数组有点特殊:它的每个元素都是一个int型的指针。
数组指针
int (*p2)[10];
在这个定义里面,由于有括号,所以p2先和“*”结合形成指针,然后再和“[]”结合,形成数组指针。换句话说,p这个指针指向的是一个大小为10个int的数组。
函数指针
char ** (*p3)(int i, char *b);
上述代码定义了一个返回类型为char **、参数为int 型和char *型的函数指针。函数指针。。。先函数后指针,根据名字推断:指针p3肯定与函数最后结合。而事实的确如此:*p3由“()”包起来,p3先是一个指针,然后才是指向一个函数。
如果去掉p3前面的*呢? 那就成了一个函数声明,与指针就没关系啦!
值得注意的是,“typedef char **(*p3)(int i, char *b)” 表示p3是一种数据类型而不是指针!!!!!!
函数指针数组
char ** (*p4[10])(int i, char *b);
这与指针数组极为相似。为什么不说与函数指针相似呢?我们来分析一下:离p4最近的是“[]”和“*”,但由于优先级问题先和“[]”结合形成数组,然后和“*”结合形成指针数组–这不就是与指针数组极为相似嘛。至于函数,它在最外面,优先级最低,所以就最后结合形成函数指针数组。
对于p4而言,它首先是一个数组,数组里面存的是指针,并且这些指针指向的是函数。
指向函数指针数组的指针
char ** (*(*p5)[10])(int i, char *b);
p5是一个指针,这个指针指向一个包含10个元素的数组。这个数组里的每个元素都是一个指针,指向返回类型为char **、参数为int 型和char *型的函数。