*(*(a+i)+j)的问题

*(*(a+i)+j)表示a[i][j],但我不理解a+i表示第i行首地址a[i],这我理解,那*(a+i)+j不就是获得指针a+i所向的数值再加j吗?关键是*(a+i)... *(*(a+i)+j)表示a[i][j],但我不理解 a+i表示第i行首地址a[i],这我理解,那*(a+i)+j不就是获得指针a+i所向的数值再加j吗?关键是*(a+i)+j这怎么理解? 展开
 我来答
淦海瑶s1
2012-01-07 · TA获得超过3646个赞
知道大有可为答主
回答量:3341
采纳率:100%
帮助的人:768万
展开全部
其实这个你要理解a,a[0],a[0][0]的地址的问题,虽然他们的地址是一样的,但是在函使用的时候是不一样的
二维数组,其实就是二层指针,不加*星号,a+i+j是二维数组第i+j个数,而不是a[i][j]。
*(a+i)这样是表示第i行的首地址
追问
你说*(a+i)这样是表示第i行的首地址,那里面的a表示什么呢   ?  a不就是数组的首地址吗
vinix
2012-01-06 · TA获得超过214个赞
知道小有建树答主
回答量:299
采纳率:0%
帮助的人:287万
展开全部
你分析的没错,没括号的话你说的就是对的。
追问
如果 int a[][3]={"1,2,3","4,5,6"}; 
那么*(a+1)+1==4+1,那么*(*(a+1)+1)==*(5)了
我是这么理解的,这种理解是错的,可是错在哪?
追答
int a[][3]={"1,2,3","4,5,6"}; 首先这种初始化时错的;

其次,a是一个二维数组,也就是int**,那么*(a+1)指向的是int*,这两个类型不同,编译器是不允许相加的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百厄度劫
推荐于2018-02-11 · TA获得超过902个赞
知道小有建树答主
回答量:680
采纳率:0%
帮助的人:841万
展开全部
假设
int a[][3]={1,2,3,4,5,6},b;
b=*(*(a+1)+1);
a是个二维数组,表示二维数组a的地址,a[0]、a[1]可看作是2个一维数组,分别是一维数组a[0]、a[1]的地址,a[0]的值为{1,2,3},a[1]的值为{4,5,6},也就是a[0][0]的值为1,a[1][0]的值为4,依此类推
a+1是个地址,是二维数组a的第二个元素的地址,也就是a[1]的地址
*(a+1)是个值,但也是个地址,其值就是二维数组a的第二个元素的值,也就是a[1]的值,a[1]是个地址,也就是一维数组a[1]的地址
因此a+1和*(a+1)其实都是a[1]的地址值,前者是二维数组的地址,后者是二维数组的值,也即一维数组的地址
*(a+1)+1也就是a[1]+1,即一维数组a[1]的第二个元素,即a[1][1]的地址
*(*(a+1)+1)就是a[1][1]的值,也就是5
a、a[0]、*a都是a[0]的地址,a+1、a[1]、*(a+1)都是a[1]的地址,可用以下语句验证
printf("%d,%d,%d",a,a[0],*a);
printf("%d,%d,%d",a+1,a[1],*(a+1));
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式