数组指针、函数指针

时间:2021-04-01 18:57:43

一、举两个例子说明数组指针的问题:

(1)比如b[3]={1,2,3};其中&b是指向整个数组的类型即b[][3],(有的人可能会搞错这里,数组名b到底和不和指针变量一样,也分配了内存给它呢?答案是否定的。数组名没有给它分配内存,数组只会分配三个整型的内存。而我们这里出现了的b,只不过是编译器的事情,b代表了数组的首地址,它某种意义上和数值常量10没有区别)而b是指向b[0]的地址,它等价于&b[0];但是注意sizeof(b)的话,得到的却是整个数组的大小,而且sizeof(&b)也是整个数组的大小。

(2)比如a[3][3]的话,按照类推,从大到小的方法,&a是指向整个数组的类型即a[][3][3],而a则是a[][3]类型的地址,它等价于&a[0];而a[0]是指向a[0][0]的地址,它等价于&a[0][0];但是注意sizeof(a)的话得到的是整个数组的大小,36个字节,而且sizeof(&a)也是整个数组的大小。但是注意sizeof(a[0])的话,得到的是整个一行数组的大小,12个字节,而sizeof(&a[0])却得到4个字节。

在定义数组指针时,我们可以这样,int (*p)[3]=a或者&b,都是相同的类型的,这个要记住。

二、函数指针:

        与其他类型定义是一样的,函数指针指的是该指针指向函数的入口地址处,不同函数有不同类型,根据返回值类型和形参值来判断的。

int func(int x); /* 声明一个函数 */ int (*f) (int x); /* 声明一个函数指针 */ f=func; /* 将func函数的首地址赋给指针f */

例如char* const *(*next)(),就是说该函数指针形参值为空,而该函数返回一个指针,该指针指向一个类型为char的只读指针。

int main()
{
int apricot[2][3][5]={{{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}},
{{16,17,18,19,20},{21,22,23,24,25},{26,27,28,29,30}}};//下面指针的维数是不同的,从大到小
int (*r)[3][5]=apricot;
int (*t)[5]=apricot[0];
int *s=apricot[0][0];
int u=apricot[0][0][0];
printf("%x\n",***r);
printf("%x\n",**t);
printf("%x\n",*s);
printf("%x\n",***(r+1));
printf("%x\n",**(t+1));
printf("%x\n",*s+1);
return 0;
}

3、数组和指针参数(摘自C专家编程p225)

“数组名被改写成一个指针参数”规则并不是递归定义。数组的数组会被改写为“数组的指针”,而不是“指针的指针”。

实参                                                   所匹配的形式

数组的数组 char c[8][10];                char(*)[10] 数组指针

指针数组   char *c[15]                     char**c;  指针的指针

数组指针(行指针)char(*c)[64]  char (*c)[64] 不改变

指针的指针 char**c                         char**c