C语言指针的声明

下面将以变量名p对声明中用到的符号进行解释
1,当p与符号[ ]结合时(结合在p的右边),符号[ ]的作用就是声明变量p是一个数组类型.[ ]里面的数字决定了数组中元素的个数,如

int p[5]; // 声明变量p是一个整型数组,数组中有5个元素

2.当p与符号( )结合时(结合在p的右边),符号( )的作用就是声明p是一个函数通过p()可以调用该函数,( )中可以有参数列表或者无参数列表,如:

int p(); // 声明一个函数p,返回值由前面的int类型决定
int p(int a,int b);// 声明一个带参数的函数p

需要注意的是,符号[ ]的优先级比星号的优先级高, 符号( )的优先级也比星号
3.当p与星号相结合时(结合在左边),符号的作用就是声明p是一个指针类型,如:

int *p; //声明p是一个指针,该指针指向int类型数据

另外的声明有:

int p(); // p是函数
int *p;  // p是指针
int p[5]; // p是数组
int *p[5];// p是一个指针数组,数组里面的5个元素为指向整型数据的指针

声明就是要先从名字p开始,然后从p的右边开始看符号(因为优先级高的符号 [ ]和 ( ) 是放在右边的),如果有符号,刚和p先结合。看完右边的符号(如果有的话)后,就决定了p是什么。这时,就到p左边的符号发挥作用了(左边要么是 * ,要么就什么都没有)。最后发挥作用是则是类型说明符(因为它在最外面)。

int *p() ;// 声明一个函数p,返回的类型为指针类型
int (*p) (); // 声明一个函数指针p,p指向一个函数

声明1:首先,要确定p是什么?从p右边的符号 ( ) 可以解得,p是一个函数。新的问题又来了,那函数p的返回值是什么类型?从p左边的星号 * 可以解得,函数p的返回值类型是指针类型。新的问题又来了,返回的指针指向的数据类型是什么啊?这时,按照套路,应该继续看外一层的右边(因为看符号的顺序为p的右左右左…,而且内层优先于外层),然而符号 ( ) 的右边没有符号了,转而看向外一层的左边。这时发现外一层的左边是类型说明符int,因此解得,返回的指针指向的数据类型是int。整个声明就是:声明p为一个函数,函数的参数为空,函数的返回值为指针,指针指向的数据类型为int。
声明2:由于这个声明中,有个括号把星号 * 和 p包住了,所以 * 和 p属于内层,而括号中p的右边没有符号,故 * 和p先结合,则声明了p是一个指针,这回答了p是什么。新的问题来了,p指向的是什么?这时,内一层的符号看完了,继续看外一层的右边,外一层的右边是符号( ) ,则解得p指向的是一个函数。然后再看外一层的左边得,该函数的返回值是int类型。整个声明就是:声明p是一个指针,这个指针指向一个函数,这个函数的返回值为int。

总结一下,解释声明的套路就是:先从最内层开始看符号,先从名字p的右边开始看,再到左边。然后跳到外一层的右边开始,再到外一层的左边开始看。不断循环,直到没符号为止。

下面是复杂的声明:

char (*(*p())[])();

首先从最里面开始,p的右边是符号 ( ) ,所以p是一个函数。再看p的左边,p的左边是一个星号 * ,所以 函数p的返回值类型为指针类型。继续跳到外一层的右边,发现外一层的右边是符号 [ ] ,所以指针指向的是一个数组。继续看左边,发现左边是一个星号 * ,所以数组中的元素的类型为指针类型。再看外一层的右边,发现符号 ( ),所以数组中的指针指向的是函数。最后看左边的类型说明符char,所以函数的返回值类型为char类型。整个声明就是:p是一个函数,函数的返回值类型是指针类型,这个指针指向的是一个数组,这个数组是指针数组(里面的元素是指针),数组中的指针是函数指针(指针指向函数),指针指向的函数的返回值类型是char类型。

char (*(*p[3])())[5];

该声明的结果为:p是一个数组,数组有3个元素,元素的类型为指针类型,这些指针都是函数指针,所指向的函数的返回值为指针 ,返回的指针指向数组,指向的数组有5个元素,元素的类型为char类型。
文章相关链接地址

发布了337 篇原创文章 · 获赞 25 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/u012581760/article/details/88219690
今日推荐