C语言的一个概念性问题,我很难理解。希望C理解的深的给我详细解释解释。Thank you !

通过地址来引用二维数组元素。
若有以下定义:
int a[3][4], i, j;
且当0<=i<3, 0<=j<4, 则a数组元素可用以下五种表达式来引用: 其中有一种是这样的:
(*(a+i))[j] 书上解释说,*(a+i) 外的一对圆括号不能少,若写成:*(a+i)[j], 因为运算符[]的优先级高于*号,表达式可以转换成:*(*((a+i)+j)), 即为: *(*(a+i+j)),

我真是不明白,为什么不加外面的括号就可以这样转换?? 看不懂呀有点。。

分析一下:*(a+i)[j]。
1.首先,因为[]优先级(顶级)高于*(次顶级),所以应先算[]。所以先只看(a+i)[j]。
2.然后,这里一堆的东西不好看,做个简化:因为a是二维数组的名字,故a+i是第i行的行指针,相当于一个一位数组的数组名。把a+i记作x,那么(a+i)[j] 就可以记成 x[j]。
3.由取下标运算的含义:x[j]实际上是*(x+j),即先找地址后进行间接运算。而x是a+i,代进去就得到*(a+i+j)。记住,(a+i)[j]也是一个行指针。
4.把前面的*代进来,得到*(*(a+i+j)),实际上是a[i+j][0]。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-08-16
就分析这一块吧:
(a+i)[j]
a实际上就是这个a数组的首地址
a+i就是这个首地址向后偏移了i*sizeof(int*)这么长的距离,对于执行过程来说,a+i 也是可以看做一个数组的首地址的,比如我们把这个首地址记做b,这样b[j]就可以等于b+j
所以:(a+i)[j] = b[j] = b + j = (a + i) + j
这个(a+i) + j 实际上是 a向后偏移 i*sizeof(int*)这么长的距离 再偏移 j*sizeof(int*)这么长的距离,所以可以写作 a+i+j
其实你将这些都从内存地址来理解应该比较容易些。
说得冗长,不知对你有帮助没有追问

谢谢,不过我认为你回答的有一点好像有误。
a是一个二维数组,a是首地址。可是a的基类型不是int型。 数组a[3][4] 可以看作a[0],a[1],a[2]的一维数组。所以a 是一个行指针。 所以a的基类型应该是一个基类型为int的有四个元素的一维数组。 所以 a+i 应该是首地址向后偏移了 i*4*sizeof(int) 这么长的距离吧。
不知道我的分析有没有道理。
相互学习,呵呵。

第2个回答  2011-08-16
就是优先级问题啊 比如指针c, *c++跟*(c++)的值肯定不一样的

C语言的一个概念性问题,我很难理解。希望C理解的深的给我详细解释解释...
2.然后,这里一堆的东西不好看,做个简化:因为a是二维数组的名字,故a+i是第i行的行指针,相当于一个一位数组的数组名。把a+i记作x,那么(a+i)[j] 就可以记成 x[j]。3.由取下标运算的含义:x[j]实际上是*(x+j),即先找地址后进行间接运算。而x是a+i,代进去就得到*(a+i+j)。

C语言的一些题目:不太理解代码,求详细解释,手写部分看不懂
首先main()是主函数,通俗来说就是一个程序的入口,只能先运行main函数。而题中的fun在main中被调用了,并且传入的参数值是500 从题目中得知,需要取 被13或17整除的数字 下图红框可知,k就是那个除数,也就是500,所以int fun括号中输入的应该是k 所以填入int k 最后题目要求最大十个,我也懒...

C语言中的问题不明白为什么 新人麻烦详细解释一下谢谢
scanf不指定分隔符时,默认以空白字符(空格、回车、制表符)为分隔符。PS:如果写%d%c不指定分隔符号。由于第二个变量是字符型,输入时中间不要加空格符,否则会将空白符号做为字符接收。

C语言中错误的整型变量新人麻烦详细说明一下谢谢
在上一章我们了解C语言的基本结构并手写了第一个C程序,当然由于一些操作上的失误,导致了未能给大家展示编写程序的截图。哦,还有小伙伴问我用的什么软件,我现在在用dev。上一章的截图 那么我们也要开始对今天的内容进行学习了,今天我们应该开始学习一些C语言中的基本概念,常量与变量、各种类型数据的...

【急】小弟我刚学C语言 由于自学 无法理解变量的意思 望高手解答下_百 ...
简单而深入给你讲下你就会明白:所谓int,float,double,char,short等量为什么要划分怎么多呢?以为在人处理事的事情基本在这个范围之内,少了不够用,多了浪费空间。若你想设其他类型变量都行。C语言构造体可以实现(只不过不是关键字而已)在内存中根据类型只不过划分一下空间大小,内存又不认识那些什么...

C语言中很难理解的部分
首先应该明白,位运算是指对二进制位进行的运算(言下之意是要对其他进制数与二进制数的转换熟练掌握才能更好的理解),运算对象只能是整型数或字符型数据而非其他。位运算结果为整型数据。下面是各位运算符的介绍:1、&,是指参与运算的两数对应位相与,也就是对应位都是1,则该位结果为1,否则为...

C语言问题,求大神解决,谢谢啦,我是小白,最好能够解释下原因..
第二项和第四项结果等同都是指向指针的指针操作。可以将二维数组看成一个双重指针,第一个中括号是一个一重指针。比如说a[n][m]中a[0]是一个指向a[0][m]数组首位a[0][0]的指针,而a则是指向指针数组*a[n]的首位a[0]的指针。这样我们来看B选项,*(a+2)表示一个指向a[2][0]的指针...

请教大家一个c语言中的问题?这个问题已经困扰我很久了。题目如下:
首先你要明确这样一个问题。在C语言中,变量是有生命周期和作用域的(链接类型暂时不提)生命周期,指变量对程序可见的范围 作用域,指变量对程序可修改的范围 注意:有生命周期的变量不一定有作用域(也就是说,可以访问的变量不一定全是可修改的)另外你应该知道,C语言函数只能按值传参,而且形参被...

C语言的题,都不难,帮忙解答,追加悬赏喔。麻烦把各个选项都解释解释最好...
第五题:这个题是因为C选项for语句在读入一个换行之后就停止了,所以并不能统计所有输入。第六题:这里的p是指针,他就相当于dt,++p->x = (d[1].x) = ++3 = 4,注意这里的++是作用于P的,所以要先递增p,后面的++p—>y,其实这个值是不确定的,以为p现在已经不是指向a中的元素了。所以...

关于c语言的一个问题,可以给我解答一下嘛
选D是对的 注意k=1 和 k==1 的区别 k=1是赋值语句,while(k=1)表示先将k赋值为1,再判断k是否为真,若为真就执行循环体语句 k==1是逻辑判断语句,while(k==1)表示如果k的值是1,就执行循环体语句,否则跳过while执行之后的语句!

相似回答
大家正在搜