C语言中int *p[n]和int (*p)[n]的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wuyuzun/article/details/82778553

前言

  1. 本博文基于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. 由1和2分析可知:编译器为整型变量a,b,c,d和数组p分别分配了不同的地址和空间;
  2. 由1和3分析可知:数组p内的元素正是整型变量a,b,c,d的存储地址;
  3. 由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. 从1,2,3,4可以看出来,(值)a=p=*a=*p=&a[0][0]=&p[0][0] ;它们都代表地址,而且是二维数组a的首元素的首元素的地址;这里就将p与二维数组连接了起来;

所以:int (p)[n] 就是一个数组指针,数据类型为int ()[n];数组元素为数组;

猜你喜欢

转载自blog.csdn.net/wuyuzun/article/details/82778553
今日推荐