Re: [问题] C语言的问题

楼主: LPH66 (-6.2598534e+18f)   2014-06-27 03:06:46
※ 引述《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 了

Links booklink

Contact Us: admin [ a t ] ucptt.com