指针是C语言的精华,所谓成也指针,败也指针。指针就是一把双刃剑,用的好,可以斩妖除魔,用的不好,也会伤了自己。废话不多,就一句话,指针很重要,我就来给大家说说数组和指针的一些小知识。有错误还请大神指点指点。
1.指针数组。
首先他是一个数组,那么数组中存的是指针,强调的是数组,数组,数组。重要的话说三遍。还有数组占多少字节由数组本身决定。他是“储存指针的数组”的简称。
2. 数组指针。
那现在清楚了,他是一个指针,他指向数组,强调的是指针,指针,指针。你懂得。这个指针是指向一个数组的,厉害吧。
那现在来几个代码看看:
int *p1[10]; //指针数组
int (*p2)[10]; //数组指针
有没有有点蒙啊,蒙就对了,那就继续往下看;这里需要明白一个符号之间的优先级的问题,“[ ]”
比“ * ”
的优先级要高,p1会先和“[ ]”
结合,构成一个数组,数组名为p1,int *
修饰的是数组的内容,即数组的元素。那么int *p1[10];
就清楚了,他是一个数组,存了10个指向int
数据类型的指针,即指针数组。
int (*p1)[10];
就更好解释了,在这儿()
的优先级比[]
的优先级高,那么 p2 先和*
结合,说明 p2 是一个指针,p2是指针变量名。int
修饰数组的内容,即数组的每个元素。数组在这里没有名字,是一个匿名数组,p2 是一个指针,它指向一个包含10个int
类型数据的数组,即数组指针。
还不清楚,别担心,有图有真相。
3. 函数指针。
既然明白数组指针是什么东西,那么函数指针也一定知道喽。首先老套路,他是一个指针,没毛病,好,指向的是一个函数,说不清楚,看代码:
char *(*fun)(char* p1, char* p2);
在给看个代码,会清晰很多。
int (*)[10] p;
这是什么?是不是定义的数组指针。
那么char* (*)(char* p1, char* p2) fun ;
是什么?是不是定义一个函数指针。这时,一个题外话(师爷,你给翻译翻译,什么是惊喜?)。我来告诉大家什么是 surprise 。这时一个函数指针,fun 是一个指针变量名,指向一个函数,这个函数有两个参数,分别为字符指针 p1 和字符指针 p2 ,这个函数的返回类型是 字符指针 类型。那么我们把代码写成char* (*)(char* p1, char* p2) fun ;
岂不是很好吗?的确很好,but 编译器不认,哈哈。
4. 函数指针数组。
我们现在已经知道表达式char* (*fun)(char* p1, char* p2) ;
定义的是一个函数指针 fun 。既然 fun 是一个指针,那么我们把它存在数组里好不好?不好也得好哈。看代码:char* (*fun[3])(char* p1, char* p2) ;
看出来多了什么吗?考察你的眼力。我在fun 后面加了一个 [3]
,现在就把这个代码变成了一个函数指针数组啦。有意思吧,来来来,来看我分析。
char* (*fun[3])(char* p1, char* p2) ;
他是一个数组,数组名是 fun 。数组中存了3个指向函数的指针。我把它变换一下 你在来看char* (*)(char* p1, char* p2) fun[3] ;
对吧,清晰了吧。这3个指向函数的指针指向 {一些返回类型为指向字符的指针、参数为一个指向字符的指针的函数}。我的天哪!不难哈。^_^。重点是要明白这时一个数组。
5. 函数指针数组的指针。
在忍忍,马上就可以看到胜利的曙光了,也不难嘛,这不就是一个指针嘛。这个指针指向一个数组,这个数组里面存的是指向函数的指针。看吧,我说的不难。
来来来,看代码:char* (*(*pf)[3])(char* p)
。把变量名写在后边,在来看代码:char* (*(*)[3])(char* p) pf
听我解释:pf 首先是一个指针,这个指针指向一个包含了3个元素的数组;这个数组里面存的是指向函数的指针;这些指针指向一些返回值类型为指向字符的指针、参数为一个指向字符的指针的函数。^_^。说的我都有点绕了,算了,你只要知道这是个指针就行。