对于 指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针 的简单理解

指针是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个元素的数组;这个数组里面存的是指向函数的指针;这些指针指向一些返回值类型为指向字符的指针、参数为一个指向字符的指针的函数。^_^。说的我都有点绕了,算了,你只要知道这是个指针就行。

上面的5个数组或者指针,只是我的一些拙见,有错误大神来帮忙。或者有上面问题欢迎留言,^_^。

猜你喜欢

转载自blog.csdn.net/qq_40421919/article/details/80220448
今日推荐