指针和数组

来源:互联网 发布:2016开淘宝店晚不晚 编辑:程序博客网 时间:2024/05/01 23:14

为了下面更好的分辨指针数组混合概念,我们首先辨析一下什么是指针,什么是数组

指针:

int *p;

这段代码在内存上开辟出四个字节的空间,然后把这四个字节大小的空间命名为p,同时限定这四个字节的空间只能存储某个内存的地址,即使存入别的任何数据,都会被当作地址来处理,且限定存int类型的数据,为了更好的理解这个概念我们图示来解释一下

                                                      指针p指向地址为0x000012ff的内存

                                                                              


数组

int a[5];

定义了一个数组,其中包含五个int类型的数据

                                                                                           数组示意图

                                                 



指针数组和数组指针

指针数组:其实我们可以叫做指针的数组,通过汉语语法分析,我们知道“指针的”是修饰数组的,所以说指针数组本身是一个数组,其中存放的每个元素类型为指针类型,

数组指针:其实我们可以叫做数组的指针,同样的我们知道它首先是一个指针,它指向的是一个数组。


int *p1[10];

int (*p2)[10];

上面这两个都定义包含了数组指针和指针数组的定义,那到底谁是谁呢?对于这个问题我们首先需要搞清楚"[]"的优先级比"*"高,

第一个定义首先和方括号结合,当然是指针数组,它代表数组包含十个元素,其中每个元素的类型是int*;第二个由于"()"可以改变优先级,所以它优先和"*"结合,所以它是数组指针,它代表指针指向一个有十个元素,其中每个元素都是int类型的数组。

                                           

函数指针

有了之前的铺垫,我们接下来给出函数指针的定义

void(*fun)(int,int)

它的含义是fun指向返回值为空,参数有两个且类型均是int类型的函数,

int Add(int a,int b)

{

    return a+b;

}

int main()

{

 int (*fun)(int,int)=Add;

printf("%d\n",fun(1,2));

}

函数指针数组

定义void(*fun[n])(int,int) 
[]优先级高,与fun结合,首先它是一个数组,数组内存放了n个函数指针。比如说有时候我们如果需要在一个循环中,每次调用不同的函数(这些函数的返回值和参数相同,函数名不同,实现不同),那么就可以使用函数指针数组来使代码更加简练和易读。、

函数指针数组

定义 void ( * (*fun)[3])(int,int); 
这个指针指向一个包含了3 个元素的数组;这个数组里面存的是指向函数的指针;这些指针指向一些返回值类型为void的指针、参数为整形的函数。 
其实也好理解,这里的函数指针数组指针不就是一个指针嘛。只不过这个指针指向一个数组,这个数组里面存的都是指向函数的指针,仅此而已。