作者LPH66 (1597463007)
看板Programming
标题Re: [问题] C语言的问题
时间Fri Jun 27 03:06:46 2014
※ 引述《ericdoctor (小黑)》之铭言:
: int array[3][4] = {{10,11,12,13},{4,5,6,7},{18,19,20,21}};
: printf("%d\n%d\n",(*(array+1))[1],*((array+1)[1]));
: 5
: 18
array 的型态是 int[3][4], 或曰「3x4 的二维 int 阵列」
阵列变数在多数状况下会 decay 成指向其首元素的指标
於是在式子里因为要计算 array+1 的关系
它 decay 成了一个 int(*)[4], 或曰「指向「长 4 的一维 int 阵列」的指标」
其指向这个二维阵列的首元素, 即 {10,11,12,13} 这一列
故 array+1 就是往後移一列, 是个 int(*)[4] 指向 {4,5,6,7} 这一列
接下来是分歧点
状况一先取值
这里的「值」是一个 int[4], 或曰「长 4 的一维 int 阵列」 (注意上面的双重引号)
所以 *(array+1) 就是 {4,5,6,7} 这个一维阵列
再对这个阵列取 [1] 就取到 5 了
状况二则是先取 [1], 我们知道对一个指标 p 做 p[1] 等同於 *(p+1)
↑
所以这里又做了 +1 因此又指到下一列去; 然後这个取值 ──┘
得到了一个跟刚才一样的「长 4 的一维 int 阵列」
只不过这次得到的是第三列 {18,19,20,21}
最後原来式子里的取值则是这个阵列又 decay 成指向这阵列首元素的「int 指标」
在此即是指向 18 的指标
所以取值就得到 18 了
---
话说回来, C 语言中规定 a[b] 的结果是 *(a+b)
所以其实状况一里的 [1] 我跳了一步
事实上那里也是 decay 成指向那一列首元素的「int 指标」 (指向 4)
加 1 就指向 5, 再取值才得到 5 的
C 语言里所有阵列的 [] 存取 (规定上) 都是经过这一道手续才得到值的
只是对於普通一维阵列时它的结果跟我们的直觉相符罢了
--
'Oh, Harry, don't you
see?' Hermione breathed. 'If she could have done
one thing to make
absolutely sure that every single person in this school
will read your interview, it was
banning it!'
---'Harry Potter and the order of the phoenix', P513
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.195.39.85
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/Programming/M.1403809609.A.794.html