C语言中定义int c[4][5],(*p)[5];p=c;其中p、p[0]、*p有什么区别?

作者&投稿:益宰 (若有异议请与网页底部的电邮联系)
c语言若有下列说明和语句:int a[4][5], (*p)[5]; p = a; 则对a数组元素~

如果定义int (*p)[n];p1=a;p1++后,p指向a[1][0];
则p+j将指向a[0]数组中的元素a[0][j]。
由于a[0]、a[1]┅a[M-1]等各个行数组依次连续存储,则对于a数组中的任一元素a[i][j],指针的一般形式如下:
p+i*N+j,相应的如果用p来表示,则为*(p+i)+j;
元素a[i][j]相应的指针表示为:
*( p+i*N+j) ,相应的如果用p1来表示,则为*(*(p+i)+j)。
推出以下的等价关系:
a+i == p+i;a[i] == p[i] == *(a+i) == *(p+i);a[i][j] == p[i][j] == *(a[i]+j) == *(p[i]+j) == *(*(a+i)+j) == *(*(p+i)+j)。

扩展资料:
对上述二维数组a,虽然a[0]、a都是数组首地址,但二者指向的对象不同,a[0]是一维数组的名字,它指向的是a[0]数组的首元素,对其进行“*”运算,得到的是一个数组元素值,即a[0]数组首元素值,因此,*a[0]与a[0][0]是同一个值;
而a是一个二维数组的名字,它指向的是它所属元素的首元素,它的每一个元素都是一个行数组,因此,它的指针移动单位是“行”,所以a+i指向的是第i个行数组,即指向a[i]。对a进行“*”运算,得到的是一维数组a[0]的首地址,即*a与a[0]是同一个值。
参考资料:
百度百科-数组指针

先上结论:
对于int a[5],*p;
p=a; 或p=&a[0]是正确的
p=&a严格来说是错误的
首先要搞清楚a与&a的区别:a表示数组首元素的首地址,即元素a[0]的地址;&a表示整个数组的地址。二者的值是相同的,但意义并不一样。正如成都市政府与四川省政府的地址都在成都,但二者表示的含义不同。
如下图所示,a表示a[0]的地址

&a则表示整个数组的地址

二者的值之所以相同,因为地址是取自第一个字节的地址,数组元素a[0]的第一个字节与整个数组的第一个字节显然是相同的。
a与&a[0]及&a的值如下:
1244980,1244980,1244980
a+1与&a[0]+1值如下:
1244984,1244984
但&a+1的值为1245000。
a+1与&a[0]+1都是表示下一个数组元素的地址,以元素为单位相加,地址值+4。而&a+1表示下一个数组的地址,以数组为单位相加,地址值+20.
所以,p=a; 或p=&a[0]是正确的,表示指针p指向数组的首元素。

这个不太好理解啊!
第一个int c[4][5]是二维数组, 可以理解为有4个元素的数组,其中每个元素又是5个整数的数组.
第二个int (*p)[5]是数组指针, p是一个指针, 它指向的是int [5],即5个整型, 这时p++是增加20个偏移.与int *p[5]不同;
p = c 就是数组指针p指向 &c[0], 当p = c时p[0]就是c[0], p[1]就是c[1]; p[1][0]就是c[1][0];

上面的定义可用如下替换:
typedef int MyType[5];//定义一个新的类型,大小为5个整数.
MyType c[4];
MyType *p;
p = c;
这样就好理解啦.

C中指针与数组关系较复杂, 但只要把a[5], b[4][5], c[3][4][5], *p1, *p1[5], *p2[4][5], (*p3)[5]等搞懂就差不多了. ^_^

int c[4][5] 是整数型二维数组
(*p)[5]; 是整数型指针数组
p=c 就是指向a[4][5]的首地址a[0][0];
p[0] 中指针,只能指向地址。 例p[0]=a[0]; p[1]=a[1];
*p 就是P指向的值。


新青区15051974828: C语言中定义int c[4][5],(*p)[5];p=c;其中p、p[0]、*p有什么区别? -
栋屈洁维: 这个不太好理解啊!第一个int c[4][5]是二维数组, 可以理解为有4个元素的数组,其中百每个元素又是5个整数的数组.第二个int (*p)[5]是数度组指针回, p是一个指针, 它指向的是int [5],即5个整型, 这时p++是增加20个偏移.与int *p[5]不同; p ...

新青区15051974828: C语言中定义int变量,默认值是多少 -
栋屈洁维: 如果是定义的全局变量或者静态变量,未初始化的话就是0.如果是局部变量,那就是以前残留在堆栈里的随机值. 区分变量的类型,有两种情况. 1、局部变量. 局部变量在没有显式初始化时,其值C语言规范没做要求,可以是随机值,也可以...

新青区15051974828: c语言中int*代表什么意思 -
栋屈洁维: int*表示定义一个int*类型的变量,即int型的指针变量. int表示基本的数据类型(整型); *表示指针操作符. 举例如下: int a[]={1,2,3,4,5}; // 定义一个int类型的数组,包含5个元素int* p2=a; // 定义一个int类型的指针变量p1,指向数组a的首c语言中int*代表什么意思

新青区15051974828: 关于c语言中的定义int类型的常量 -
栋屈洁维:可以这样定义 但行尾必须加分号. 不过你这样定义的是变量 并不是常量 要定义常量可以写为 const int a = 0x12345678; 或者直接用宏定义 #define CONST_A 0x12345678 PS:宏定义时无需加分号 int a =0x12345678;//定义一个...

新青区15051974828: 请解释一下在C语言环境中(*cp)[5]个符号的意义 -
栋屈洁维: 例如定义int (*cp)[5]; 首先找到变量的名字,cp与*结合表示是一个指针变量,确定是指针变量之后然后再确定指针变量的类型是指向含有5个元素的一维数组.所以这个符号的含义就是定义一个指向含有5个元素的一维数组的指针

新青区15051974828: 数组定义中,int a[ ][4]; 这个对吗? -
栋屈洁维: 在C语言中允许多维数组的第一个维度不声明具体值,但必须在紧跟其后的初始化的一对{}中给明具体的元素.如:int a[][4]={{1,2,3,4},{5,6}}; 这种写法是正确的,但int a[][4];这种写法是错误的.

新青区15051974828: C 语言里头,这个定义,是什么意思? int a[] - AST = {10, 20, 30}; -
栋屈洁维: 意思是:定义一个长度不确定的一维数组 如:int num[ ]={1,2,3,4,5}; 但你上面的写法是错误的!

新青区15051974828: 高手帮忙!C语言:定义一个4行5列的二维数组,求出每行元素之和,分别放在一个一维数组中. -
栋屈洁维: #include#include void main() { int qh(int a[4][5],int b[4]); int a[4][5],b[4]; int i,j; qh(a,b); for(i=0;i<4;i++){ for(j=0;j<5;j++) printf("%-5d",a[i][j]); printf("%-5d",b[i]); printf("\n");} } int qh(int a[4][5],int b[4]) { int i,j; srand(time(NULL)); for(i=0;i<4;i++) for(j=...

新青区15051974828: 若有定义:int c[4][5], (*cp)[5];和语句cp=c;,则能正确引用c数组元素的...
栋屈洁维: 26------------- 分析:,在C语言中表示逗号表达式.程序会一直计算直到最后一个表达式,并返回该表达式的值!如上示例:c=(a=4*5,a*2,a+6),等价于 c=(20, 40, 26),返回最后一个,等价于 c=26

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网