请求解析C语言二维数组代码输出19的具体计算过程
拆解这个C语言表达式的计算逻辑
先把代码贴出来方便对照:
#include <stdio.h> int main(void) { int a[4][5] = { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9,10 }, {11,12,13,14,15 }, {16,17,18,19,20 } }; printf("%d\n", *(*(a + **a + 2) + 3)); return 0; }
咱们一步步拆解那个看起来有点绕的表达式 *(*(a + **a + 2) + 3):
先算最内层的 a
- 在C语言里,二维数组名
a本质是指向第一个一维数组a[0]的指针。所以*a就是a[0](也就是第一个一维数组的首地址),再解引用一次**a就等于a[0][0],对应的值是1。
- 在C语言里,二维数组名
接着算
a + **a + 2a是指向一维数组的指针,每偏移1个单位就指向数组的下一行(因为每个元素是包含5个int的一维数组)。这里**a是1,所以a + 1指向第二行a[1],再加2就得到a + 3,也就是指向第四行a[3]的指针。
然后解引用这个结果:
*(a + **a + 2)- 解引用
a + 3就得到a[3],也就是第四行一维数组的首地址,指向a[3][0]。
- 解引用
再加上3:
*(a + **a + 2) + 3- 这里
a[3]是指向int的指针,偏移3个单位就指向a[3][3]的地址。
- 这里
最后解引用得到值:
*(*(a + **a + 2) + 3)- 解引用这个地址,就拿到了
a[3][3]的值,也就是19。
- 解引用这个地址,就拿到了
这样一步步拆下来,是不是就清楚为啥输出是19啦~
内容的提问来源于stack exchange,提问作者sk_py3
相关产品推荐
相关产品推荐

