c语言大神进: 大神,再问你个问题,麻烦下下 对于二维数组来说,a[i]与&a[i]等价, c语言大神进 c语言中,例如一个二维数组a[3][4],则a...

作者&投稿:台宰 (若有异议请与网页底部的电邮联系)
a[i]与&a[i]等价? 不对啊,两者类型完全不同,一个是int* 一个是 int*[10],只能说两者指向的地址一样。

后面的也都是同样的,不同的类型,同样的地址。
int a[10][10];

if (a[1] == &a[1])

printf("ok\n");

这样是编译不过的。

int a[10][10];

if ((void*)a[1] == (void*)&a[1])

printf("ok\n");

这样是能够返回ok的

不等价……

C语言:关于二维数组的指针问题, 对于一维数组来说,数组a[i]的数组名a就是数组首元素的首地址,~

首先二维数组是不是可以看成几个一维数组的结合
比如a[3][4]是不是代表3个一维数组,一维数组的大小是4
那么第一个数组的数组名是a[0],然后a[0]这个数组里面有四个元素分别为{a[0][0],a[0][1],a[0][2],a[0][3]},第二个数组名是a[1],以此类推
二维数组相当于也是一个数组,里面装的都是一位数组a[3] = {a[0],a[1],a[2]},这里的a[0]-a[3]是三个一维数组,那么*(a+i)就是a[i],a[i]就是一维数组名,数组名是不是就是地址,那么*(a+i)就是地址,*(a+i)+j 是不是等价于a[i]+j ,a[i]我们刚才说了是一维数组名,也就是地址,一个地址加上j是不是还是地址呢?*(a+i)+j = &a[i][j]的

题主还是不理解指针。
char str[][10]={"ok","good"},*p;这个定义里str相当于一个二维指针,而p是一维指针。
二维数组在内存中按行存储,所以可以说整个二维数组包含两个一维数组,也就是两行,第0行是“ok”,第一行是“good”。 "ok"和"good"的首地址分别为(一维指针)str[0]和str[1],str[0]只是指向二维数组第一行的(一维)指针,而str是指向整个二维数组的(二维)指针,所以,p和str[0]都是一维字符型指针,赋值是没问题的,但是p=str;是不对的。