C语言二维数组的问题

2024-11-24 13:28:22
推荐回答(4个)
回答1:

二维数组,相当于两层指针
也就是说,是指向指针的指针
a,a[0],&a[0][0]都是首地址的地址内容,但是意义很不相同
a表示整个数组的首地址,
a[0]是第一行这个数组的首地址
&a[0][0]这个表示第一个元素的地址

如a[0],这个表示第一行的所有元素。而不是一个元素
可以把它看做一个数组,那么a[0]就是一个数组名,一般表示这个数组的首地址

这么说来,a+i是i行的首地址,也可以说是a[i]这个数组的数组名,是一个地址
那么*(a+i)还是一个指向第i行的第一个元素的指针,他是一个地址
*(*(a+i)+j)这样才是第i行第j个元素的内容

回答2:

C语言在这点上是很混扰人的。C语言形式逻辑不成立。所以一个星,两个星的,烦人呢。
a[3][4]; 是2维数组,两个星 才是 内容!
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
printf("%d", *(*(a+1)+1)); // 打印出 6.
*(a+1)+1 是 a[1][1] 的地址。
a[0]+1 -- 印错了,是地址 a[1]+1, 打印出 6.

回答3:

已经调试通过,修改地方加了注释,望采纳!!! #include void main() { int a[3][3]={{1,2,5},{2,4,8},{88,999,7}},i,(*cp)[3]=a,j,t; for(i=0;i<3;i++) { for(j=1;j<2;j++) // 下面的2个if语句就是把中间的一个元素和第一个以及最后一个比较,所以这里循环次数改下就行了 { if(a[i][0]a[i][j]) // 和最后一个比较 { t=a[i][2]; a[i][2]=a[i][j]; a[i][j]=t; } printf("%d,",a[i][j]); } printf("\n"); } printf("\n\n"); for(i=0;i<3;i++) { for(j=0;j<3;j++) printf("%d,",a[i][j]); printf("\n");} } ~

回答4:

*(a+1)+1无条件等价于a[0]+1,什么,你不知道为什么? 我给你讲讲:
*(a+1)如果是要表示内容的话,a应该是个指针变量,或者是一维的数组名,那你说a是指针变量吗?a是一维数组名吗? 呵呵!都不是,那你凭什么说*(a+1)是内容?
这样你能明白吗?
希望能帮到你,祝你学习进步!