*(*(a+1)+2) 一直不理解是不是应该背诵

ludongxing
ludongxing 09月24日 字数 366

*(a[1]+2), *(*(a+1)+2), a[1][2]

如果我有一个二维数组int a[9][9],那么以上这三个都表示数组a的第1行第2列元

素的值。其中a[1][2]很好理解,按数组的规定,a[1][2]就是第1行第2列的值,这

没啥疑惑,这就是定义就是这样规定的。

但是,前面两个带指针的表达式怎么理解,就强行背诵 *(a[i]+j)和 *(*(a+i)+j)

表示第i行第j列的值吗?有没有什么自然而然的办法来说明这样写不是规定,而是推导

出来的?

9 个回复
cafitren
挿fit人 09月24日

数组即指针,不明白就不要用这种古董东西了,直接上python,不然坑队友!

【 在 ludongxing 的大作中提到: 】

: *(a[1]+2), *(*(a+1)+2), a[1][2]

: 如果我有一个二维数组int a[9][9],那么以上这三个都表示数组a的第1行第2列元

: 素的值。其中a[1][2]很好理解,按数组的规定,a[1][2]就是第1行第2列的值,这

: ...................

Scriabun
Scriabun 09月24日
Scriabun
Scriabun 09月24日

我没学过C,可能C和cpp存在一些隐晦的区别,对于cpp,只要把握两点就可以理解了:

1. 在绝大多数情况下,数组名会发生数组到指针的类型转换

2. 下标操作是左结合的

另外,指针的数字运算是依据它指向的对象的size而进行的,静态数组的layout是编译期可见的

webhost
webhost 09月24日

尽量避免这样写,用子函数拆分,传递参数中降阶。

【 在 ludongxing 的大作中提到: 】

: *(a[1]+2), *(*(a+1)+2), a[1][2]

: 如果我有一个二维数组int a[9][9],那么以上这三个都表示数组a的第1行第2列元

: 素的值。其中a[1][2]很好理解,按数组的规定,a[1][2]就是第1行第2列的值,这

: ...................

dreamr
追梦人 09月24日

数组变量本质上就是指针,a[1] 通过指针的offset 取值;

*(a+1) 先移动指针,然后取值;

【 在 ludongxing 的大作中提到: 】

: *(a[1]+2), *(*(a+1)+2), a[1][2]

: 如果我有一个二维数组int a[9][9],那么以上这三个都表示数组a的第1行第2列元

: 素的值。其中a[1][2]很好理解,按数组的规定,a[1][2]就是第1行第2列的值,这

: ...................

lipp
09月24日

这个不是学了C指针定义的那章就懂了么?

a[1]你打印出来看的话是个内存地址数据啊,类似0x298EA87BB这种。+2就是隔壁的隔壁的内存。理解起来很形象的。

【 在 ludongxing (ludongxing) 的大作中提到: 】

: 标  题: *(*(a+1)+2) 一直不理解是不是应该背诵

: 发信站: 水木社区 (Fri Sep 24 09:34:48 2021), 站内

: *(a[1]+2), *(*(a+1)+2), a[1][2]

: 如果我有一个二维数组int a[9][9],那么以上这三个都表示数组a的第1行第2列元

: 素的值。其中a[1][2]很好理解,按数组的规定,a[1][2]就是第1行第2列的值,这

: 没啥疑惑,这就是定义就是这样规定的。

: 但是,前面两个带指针的表达式怎么理解,就强行背诵 *(a[i]+j)和 *(*(a+i)+j)

: 表示第i行第j列的值吗?有没有什么自然而然的办法来说明这样写不是规定,而是推导

: 出来的?

: --

simonvic
simonvic 09月24日

别用前面俩,解决问题。

【 在 ludongxing 的大作中提到: 】

: *(a[1]+2), *(*(a+1)+2), a[1][2]

: 如果我有一个二维数组int a[9][9],那么以上这三个都表示数组a的第1行第2列元

: 素的值。其中a[1][2]很好理解,按数组的规定,a[1][2]就是第1行第2列的值,这

: ...................

z16166
Netguy 09月24日

对的,不用晦涩的写法,免得自己和别人都糊涂

huacx
lalala 09月24日

被谭浩强整的吧

发自「今日水木 on iPhone X」

【 在 ludongxing 的大作中提到: 】

: *(a\[1\]+2), *(*(a+1)+2), a\[1\]\[2\]

: 如果我有一个二维数组int a\[9\]\[9\],那么以上这三个都表示数组a的第1行第2列元

: 素的值。其中a\[1\]\[2\]很好理解,按数组的规定,a\[1\]\[2\]就是第1行第2列的值,这

: ..................

freyoneby
freyoneby 10月06日

可读性第一,效率由算法决定,代码快个几纳秒,划不来,除非后面不维护了