int *p[3]和int(*p)[3]的区别

如题所述

这两个其实是数字指针和指针数组的区别。我们一个一个来说明:

(1)int*p[3];//定义了一个三维数组,其中的每个元素p[0]、p[1]、p[2]都是指向int变量的指针。

(2)int(*p)[3];//定义了一个指针,这个指针是指向一个三维数组的。

两者之间的区别和联系可以用一个二维数组来阐述:

int *p[3];//定义p[3]为指针数组;int (*q)[3];//定义q为数组指针;int a[4][3];//定义一个二维数组

p[0]=&a[0][0];//可以取a[4][3]中任意元素的地址给p[3]中的元素赋值。q=a[1];//a[1]其实是一个三维数组,其元素包括a[1][0],a[1][1],a[1][2],所以 //a[1]就表示这个数组的首地址,这个地址可以用来给q赋值。

扩展资料:

举例说明如下:

(1)数组指针:

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};int (*p)[4];p=(int(*)[4])a;for(int i=0;i<3;i++){for(int j=0;j<4;j++)

{printf("%d",p[i][j]); //或者 *(*(p+i)+j) 或者 *(p[i]+j)}printf("\n");}

(2)指针数组:

int ix=0;int i=0,j=0;int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

int *p[3];for(ix;ix<3;ix++)p[ix]=a[ix];for(i;i<3;i++){for(j=0;j<4;j++)//注意这里的j要赋值等于0,要不然只能输出第一行1234,达不到预期的效果

{printf("%d",p[i][j]); //或者 *(*(p+i)+j) 或者 *(p[i]+j)}printf("\n");}

参考资料:数组指针_百度百科

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-05-20

int *p[3]这个叫指针数组,本质上是一个数组,数组元素类型是指向int型的指针


int (*p)[3]这个叫数组指针,本质上是一个指针,指针指向的是一个有3个int型元素的一维数组


对于这种问题最简单的方法是结合运算符优先级/结合性,先确定定义的本质是什么,然后再由内向外一层层理解

例如

int *p[3] ,有运算符优先级/结合性可知,等效于int *(p[3]),那么首先可以确定,p的本质是一个有3个元素的数组,那么数组元素的类型是什么呢,往外看可知,为指针类型,那么指针指向的类型又是什么呢,再往外看,可知为int,所以最后整理下就可以知道p是一个有三个元素的数组,该数组元素类型为指向int的指针

int (*p)[3]同理

第2个回答  推荐于2017-09-24
int *p[3]是一个数组 其中有三个元素 元素是指针
int(*p)[3] 是一个指针 该指针指向一个存有3个整形的数组本回答被提问者采纳
第3个回答  2014-05-20
int *p[3] p是一个数组,此数组有3个元素,每个元素都是int*类型,也就是指向整型数据的指针类型。

int a=10,b=20,c=30;
int*p[3]={&a,&b,&c};

而int(*p)[3]中的p是一个指向数组的指针,也就是说它指向的不是一个数,而是一个数组, p是指针,指向[3]个大小的数组···如 int a[2][3]; int (*p)[3]; p=a;
相似回答