高级指针

来源:互联网 发布:淘宝刷好评买家封号 编辑:程序博客网 时间:2024/04/23 20:49

1.指针数组

int *p[10];

这就是指针数组,首先它是一个数组,这个数组里面装了10个指针。

2.数组指针
int (*p)[10];
这是数组指针,它是一个指针,一个指向数组首元素的指针。


区别和理解:
很多初学者对这两个东西的概念弄的不是很清楚,要是学了一阵子又很久不学,下次再看见,又不知道哪个是所以哪个了,所以要想真正记住他们,我们还必须理解记忆。

这两个表达式中,唯一的不同就是数组指针多了个(),这个括号的作用大家都知道,它能改变优先级。

1).如果不加括号, 它就是指针数组。
* 和[]的优先级就会不一样,[]的优先级要高于 * ,所以p先和[]结合,结合过后它就是p[],这明显就是一个数组,之后再结合 * ,表示数组的元素类型是指针。其实我们应该把int和 * 放在一起看,即int * ,它表示数组的元素类型是整型指针。

2).如果加上括号,它就是数组指针。
() 使 * 和p先结合,所以它是一个指针,再结合[],表示指向数组的指针,int修饰指针为整型指针。

3).指针数组是数组,数组指针是指针。 * 和 [] 谁的优先级高,就是什么类型。

3.函数指针
函数指针是指向函数的指针变量。 因而”函数指针”本身首先应是指针变量,只不过该指针变量指向函数。

这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。

如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。

函数指针有两个用途:调用函数和做函数的参数。

4.函数指针数组

int (*p[])(int ,int);

函数指针数组是一个其元素是函数指针的数组。那么也就是说,此数据结构是是一个数组,且其元素是一个指向函数入口地址的指针。

分析:
首先,说明这是一个数组:p[]
其次,要说明其元素的数据类型是指针: *p[]
再 次,要明确这每一个数组元素是指向函数入口地址的指针:函数返回值类型 (*数组名[])()。

请注意,这里为什么要把“数组名[]”用括号扩起来呢?因为圆括号和数组说明符的优先级是等同的,如果不用圆括号把指针数组说明 表达式扩起来,根据圆括号和方括号的结合方向,那么 数组名 说明的是什么呢?是元素返回值类型为指针的函数数组。有这样的函数数祖吗?不知道。所以必须括起来,以保证数组的每一个元素是指针。

5.指向函数指针数组的指针

int*(*p)[])(int ,int)

p先和*结合,是一个指向函数指针数组的指针变量,p中存放的是整个数组的地址。这里和数组指针一样,其类型是指针,只不过家里很多定语而已。

原创粉丝点击