C语言中如何用指针运算符来表示一个二维数组的元素及地址?

*(*(a+i)+j)、*(a[i]+j)、(*(a+i))[j]为什么都表示元素a[i][j]?*(a+i)+j、a[i]+j又为什么都表示a[i][j]的地址?虽然可以死记格式,但我想知道原理,以及有什么办法来区分指针表示的到底谁元素还是地址?

二维指针,就是说第一维是指针,第二维还是指针;
拿*(*(a+i)+j)来说:a是数组的首地址吧,然后+i,就是说a地址向后偏移i位。就是a+i的地址了,注意,这里a+i只是地址,用*符号取出该地址的数据,就是*(a+i),这里*(a+i)就是第一维指针,它指的是地址,不是数据。
而且后面的*(a+i)+j就是说以*(a+i)为首地址,偏移j位,然后使用*取内容,这里就是第二维了,取到的数据就是实际数据了追问

*(a+i)不是取出指针所指数据么?为什么说又是指地址?

追答

因为这是二维指针啊

*(a+i)是指针的数据,例如0x1234,但是0x1234只是代表数据,你需要再*一下,相当于去0x1234的地址去拿 数据,这里的数据才是你要的

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-07-22
首先你得知道a就是数组第一个元素的地址,而二维数组a[i][j]可以理解为a[i]数组每个元素储存的是一个j个元素大小的另一个数组,这样理解的话,先说*(*(a+i)+j),a+i就不说了相当于被重载操作符一样,指针+1的含义就是加一个单位的数据大小,然后*(a+i)则相当于a[i]的值对吧,而a[i]的值就是下一个数组的指针现在源代码相当于*(a[i]+j),然后自己分析吧,很简单的,不过说实话没必要真么纠结,真写代码没多少人闲的蛋疼真么写的,给自己制造麻烦不说,后期维护也会很痛苦的
第2个回答  2015-07-22

相似回答