C语言中“二维数组和数组元素的地址”的为问题。

2025-05-13 15:39:44
推荐回答(4个)
回答(1):

1 你代码有错。
int *p,a[3],[4]; //[3]后面怎么有逗号呢?
//改为:
int *p,a[3][4];

2 p=a;不合法。因为类型不匹配。正确的写法如下:
int (*p)[4],a[3][4];
p=a; //上一行定义的p与a的类型才一致。

回答(2):

是吧!这不就是把数组a的首地址赋给了定义的地址p嘛!这时p和a的作用基本相同。

回答(3):

不合法,因为a是2维数组,p是一级指针。p=a[0]是合法的。

回答(4):

可以像这样用,但是要注意转换类型。
int *p,a[3][4];
p=(int *)a;
如果你学过汇编,明白内存寻址方式就好理解了。
其实C语言中并没有真正的二维数组,所谓的二维数组是通过宏定义来实现,把一维数组映射为二维数组。a[3][4]实际上是a[12];都是内存中分配12*sizeof(int)大小的连续内存,a就是其首地址。
a[i][j]等价于a[i*4+j]等价于*(*(a+i)+j);
虽然编译器中类型不同,但它们数据结构上是完全相同的,可以通过显示转换来访问。
例子如下:
#include
#include
int main()
{
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int *p;
int j;
p=(int *)a;
for(j=0;j<12;j++)
{
printf("%d\t",p[j]);
}
return 0;
}