版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wuyuzun/article/details/82778553
前言
- 本博文基于VC++6.0开发调试运行;
int *p[n] 分析:
分析这个问题要先从字符优先级开始,在字符优先级表中,[]的优先级大于*,所以,int *p[n] 就等价于int *(p[n]),这样就清晰多了,再进化一下就是 (int *)(p[n]) ,这样就完整了,显然,*(int )(p[n]) 就是一个数组,是一个数据类型整型字符型(int * ),以n个整型地址为元素,数组名为p的数组;
举个例子:
#include <stdio.h>
void main()
{
int a=1,b=2,c=3,d=4;
int *p[4] = {&a,&b,&c,&d};
//1
printf("%d\n",&a);
printf("%d\n",&b);
printf("%d\n",&c);
printf("%d\n",&d);
//2
printf("\n");
printf("%d\n",p);
printf("%d\n",p+1);
printf("%d\n",p+2);
printf("%d\n",p+3);
//3
printf("\n");
printf("%d\n",*p);
printf("%d\n",*(p+1));
printf("%d\n",*(p+2));
printf("%d\n",*(p+3));
//4
printf("\n");
printf("%d\n",**p);
printf("%d\n",**(p+1));
printf("%d\n",**(p+2));
printf("%d\n",**(p+3));
}
运行结果:
由代码和运行结果可以看出来:
- 由1和2分析可知:编译器为整型变量a,b,c,d和数组p分别分配了不同的地址和空间;
- 由1和3分析可知:数组p内的元素正是整型变量a,b,c,d的存储地址;
- 由4分析可知:符号p不仅是数组名,还是一个二重指针,并且本身指向数组首元素(变量a的地址)的存储地址;
所以:int *p[n] 就是一个指针数组,数据类型为int *,元素为地址(变量地址,数组地址,函数地址等);
int (*p)[n]分析:
规则同上,先从运算符优先级的角度来分析结构,()和[]具有相同的优先级,但是符号是从左向右,所以可以写成(int)((p)[n]),数据类型为整型int ,数组内的元素也是整型量,可以默认为这个数组名为p,数组内有n个整型元素,但是p与p的关系式指向的关系,即p指向p,根据数组的知识可知,*p就是数组首元素的地址,所以p在这里也是双重指针,这里可以将p认为是二重数组的数组名;
举个例子:
#include <stdio.h>
void main()
{
int a[][4] = {{1,2,3,4},{12,23,34,45},{1234,23456,34567}};
int (*p)[4] = a;
/* 这句可以写成:
int (*p)[4];
p = a;
*/
//1
printf("%d\n",a);
printf("%d\n",p);
//2
printf("\n");
printf("%d\n",*a);
printf("%d\n",*p);
//3
printf("\n");
printf("%d\n",a[0]);
printf("%d\n",p[0]); //注意:*a=a[0],*p=p[0];
//4
printf("\n");
printf("%d\n",&a[0][0]);
printf("%d\n",&p[0][0]);
//5
printf("\n");
printf("%d\n",**a);
printf("%d\n",**p);
}
运行结果:
分析:
- 从1,2,3,4可以看出来,(值)a=p=*a=*p=&a[0][0]=&p[0][0] ;它们都代表地址,而且是二维数组a的首元素的首元素的地址;这里就将p与二维数组连接了起来;
所以:int (p)[n] 就是一个数组指针,数据类型为int ()[n];数组元素为数组;