
C语言二维数组的问题
假设有一二维数组a[3][4];如要表示0行1列,可写成a[0][1],其地址是&a[0][1],若把a[0]看成是一维数组名,其地址又可写成a[0]+1,看教程里写着等...
假设有一二维数组a[3][4];如要表示0行1列,可写成a[0][1],其地址是&a[0][1],若把a[0]看成是一维数组名,其地址又可写成a[0]+1,看教程里写着等价于*(a+1)+1,看着把我搞糊涂了,*(a+1)不是内容吗怎么变成地址了?有谁能详细通俗说一下这里面的玄机,通俗一点哦,我是新手。
展开
4个回答
展开全部
二维数组,相当于两层指针
也就是说,是指向指针的指针
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个元素的内容
也就是说,是指向指针的指针
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个元素的内容
追问
数组名代表数组首元素的地址,那&a[0]应该与&a[0][0]同理吧。
追答
道理是相同的
在二维数组中a[0]本身就是一个地址,你要打印a[0]的话,应该是一个地址数据
再取&运算的话,好像意义不是很大
其实这东西也不难理解,就当是指向指针的指针,也就是**运算符就可以了。就是稍微难想象一点就是了
a[i]这个事一个数组,而不是一个元素,所以他是一个数组名,代表i行的所有元素,所以在c中,a[i]是一个指针的形式存在,所以a[i]他是一个指针
二维数组,相当于一个一维数组,不过这个数组中的所有元素是指针,这些指针又分别指向一个一维数组
要是真的难以理解,给你两个建议
记住固定格式,不要管那么多,套用就是了
再就是尽量避免用这个格式。他又替代的格式,就是数组下表的方式来处理二维数组
a,a[0],&a[0][0],还是那句话,这三个数据时完全相同的一个地址数据,但是代表的意义和使用的时候出现的结果是不同的
只要记住一个公式*(*(a+i)+j)代表第i行、第j个元素的内容,而不是地址。(*(a+i)+j)也就是去掉前面的一个*,他代表第i行、第j个元素的地址,这个你能理解,因为去掉了一个*
这个当ij为0的特殊情况下,公式的缩减你能辨认就好了,注意前面有几个*,这个是标志
展开全部
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.
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.
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2012-03-29
展开全部
已经调试通过,修改地方加了注释,望采纳!!! #include<stdio.h> 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][0]; a[i][0]=a[i][j]; a[i][j]=t; } if(a[i][2]>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");} }
~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
*(a+1)+1无条件等价于a[0]+1,什么,你不知道为什么? 我给你讲讲:
*(a+1)如果是要表示内容的话,a应该是个指针变量,或者是一维的数组名,那你说a是指针变量吗?a是一维数组名吗? 呵呵!都不是,那你凭什么说*(a+1)是内容?
这样你能明白吗?
希望能帮到你,祝你学习进步!
*(a+1)如果是要表示内容的话,a应该是个指针变量,或者是一维的数组名,那你说a是指针变量吗?a是一维数组名吗? 呵呵!都不是,那你凭什么说*(a+1)是内容?
这样你能明白吗?
希望能帮到你,祝你学习进步!
追问
嗯谢谢您。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询