浅析指针数组、数组指针、函数指针、指针函数、函数指针数组的指针

来源:互联网 发布:linux中dns配置文件 编辑:程序博客网 时间:2024/06/05 14:22

1. 指针数组
两个例子:
1) int a[5];
2) int *b[5];
分析:根据前面数组的学习,我们知道数组的类型是int [5],显而易见(1)是一个数组,(2)是什么,指针还是数组?答案是数组,类型是int *[5],数组当中存放的都是指针。
我们知道,定义数组时,往往是在栈上提供一大块空间给数组存放内容,而对于指针而言,只占四个字节的空间;下面通过内存来证明一下两个都是数组:
1) 数组的内存:

这里写图片描述

2)指针数组的内存:

这里写图片描述

2. 数组指针
两个例子:
1) int *p;
2)int (*p)[5];
分析:(1)是指针,而指针就是地址,在32位平台上占4个字节,在64位平台上占8个字节;(2)是什么,指针还是地址?答案是指针,所指向的元素类型是数组。
两个都是指针,那么内存所占空间都是4(或8)个字节,下面通过内存来证明一下:
1)指针p的内存:

这里写图片描述

2)数组指针的内存:

这里写图片描述

总结:以上浅析了指针数组以及数组指针;如何来辨别是指针数组和数组指针? 三个字:优先级 变量名优先和谁结合就为谁(“[]” 的优先级高于“ * ”,“()”的优先级高于“[]”)

3.函数指针
例:
void (*p) ( );
分析:这个定义看起来既像函数又像指针,到底是什么?答案是指针,有了上面数组指针以及指针的比较,再来看下这个函数指针的内存,开辟的空间也是8个字节(64位平台):

这里写图片描述

4. 指针函数
例:
void *p();
这个例子我们在写代码时经常使用,比如库函数中的memset函数等都是指针函数,在这里不在做以解释。
5.函数指针数组的指针
几个例子:
1)void (*p)();
2) void (*p[])();
3) void (*( *p)[10])();
4) void (*( *p[20])[10])();
分析:
1)函数指针;p先和“*”结合,故为指针
2)函数指针数组:故名思义一个数组,数组的元素是函数的地址
3)函数指针数组指针:故名思义是指针,指向的内容是函数指针数组
4) 函数指针数组的指针数组:同上解释,这是一个数组,数组的元素是存放函数指针数组的地址

通过以上几个例子,我们可以总结出写这些复杂表达式的规律:
根据名字从左向右,内容从外向内写。
如:书写“函数指针数组的指针的数组”。
第一步:写函数,先写出()
第二步:加指针,*()
第三步:加数组,* [ ]() (因为[ ]优先级高于*,所以不必为[ ]加())
第四步:加指针,* (* )[ ] () (因为[ ]优先级高于,所以此处要在外加())
第五步:加数组,* ( *[ ])[ ] ()
第六步:加变量名,( * ( * p [ ])[ ]) ()

书写格式(任意发挥):指向函数指针数组的指针的数组的指针的数组的指针的….

(* (* ( * ( *p )[ ]) [ ])[ ] ) ()

阅读全文
0 0
原创粉丝点击