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");}
参考资料:数组指针_百度百科
int a=10,b=20,c=30;
int*p[3]={&a,&b,&c};
而int(*p)[3]中的p是一个指向数组的指针,此数组有3个int类型的元素。例如:
int a[3]={1,2,3}; 那么p就是指向这个数组a的指针。
int(*p)[3]=&a; // 这里赋值一定要用取地址符号。也就是取数组a的地址。
不可以这样赋值: int(*p)[3]=a; // error :类型不兼容。a本来是数组类型,是不可以赋值给int(*)[3]这个类型的。
但是这样是可以的int *p1=a; // ok 因为a可以隐式转换为int*类型,其值实际上就是数组第一个元素的地址,也就是&a[0]
int *p[3];//定义了一个三维数组,其中的每个元素p[0]、p[1]、p[2]都是指向int变量的指针。
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赋值
而(*p)[3] p是一个指针变量,表示指向含有3个整型元素的一维数组
前者可以类似于二维数组 把它看成是由3个一维数组组成的 经常与字符串搭配使用 比较方便操作 把多个字符串放在一个指针数组中
后者是用来引用二维数组的 像a[2][3]这个二维数组 我们既可用指针来引用 又可用(*p)[3]来引用 一般使用(*p)[3]
int main()
{ int i,j;
int a[2][3]={3,4,5,6,7,8};
int *p[3] ;//表示存贮是3个整型变量地址;
int (*q)[3]; //表示指向3个整型数组元素的一维数组指针
//把第一行三个元素地址存放在p指针数组中
for( i=0;i<3;++i)
p[i]=&a[0][i];
//输出指针数组中地址所对应值
for( j=0;j<3;++j)
cout<< *p[j]<<" ";
cout<<endl;
q=a;//把数组a开始地址赋给指向一维数组q;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
cout<< *(*(q+i)+j)<<" "; //输出数组中元素
return 0;
}