作者RealJack ()
站内Programming
标题Re: [问题] C语言的问题
时间Fri Jun 27 15:57:07 2014
这篇回得很仔细
不过有一个地方的叙述可能要修正一下
※ 引述《LPH66 (1597463007)》之铭言:
: 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 阵列」 (注意上面的双重引号)
没错,这里被int(*)[4]指到的值是一个阵列
: 所以 *(array+1) 就是 {4,5,6,7} 这个一维阵列
*(array+1)应该是指到{4,5,6,7}这个阵列首元素的指标,type是int*
上面这两个说法是等价的(阵列的名字 = 指向首元素的指标)
*(array+1)是一个阵列,没有被命名的阵列
虽然*(array+1)没有被命名,但还是提到了一个阵列
所以*(array+1)可以当作阵列的名字,也因此退化成指到阵列首元素的指标
: 再对这个阵列取 [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 语言里所有阵列的 [] 存取 (规定上) 都是经过这一道手续才得到值的
: 只是对於普通一维阵列时它的结果跟我们的直觉相符罢了
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.248.144.83
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/Programming/M.1403855830.A.BB7.html