首页 > 解决方案 > 如何理解这个指向 C 中数据结构的指针?

问题描述

我有这段代码,我想弄清楚第二行代码的作用。

static int table [][4]= {{1,2,3,4},{2,3,4,5},{3,4,5,6}};
int valore = *(*(table+2)+1);
printf("%d",valore);

我对C中的指针有基本的了解,你能解释一下第二行代码是做什么的吗?

标签: c

解决方案


table只是一个二维整数数组。在 C 中,二维数组实际上是一个“数组或数组”。您table的尺寸为static in table[3][4];(3 行 x 4 列),它是一个由 3 个整数数组组成的数组,每个数组有 4 个元素。由于它是一个数组,所有值在内存中都是连续的。您可以将内存布局想象如下。

            +---+---+---+---+
table[0]    | 1 | 2 | 3 | 4 |
            +---+---+---+---+
table[1]    | 2 | 3 | 4 | 5 |
            +---+---+---+---+
table[2]    | 3 | 4 | 5 | 6 |
            +---+---+---+---+

数组在访问时转换为指针(在 4 种有限的情况下接受,此处不相关,请参阅C11 标准 - 6.3.2.1 其他操作数 - 左值、数组和函数指示符(p3)了解详细信息)

在问题中向您介绍了“指针表示法”。您可以使用“数组索引”或“指针表示法”访问数组的任何元素。指针表示法*(a + b)等同a[b]于数组索引表示法。你有:

*(*(table+2)+1)

如果你一块一块地拿它*(table + 2)是简单的table[2]。接下来*(table[2] + 1)就是简单了table[2][1]。因此,您可以使用任一(简单地)访问第三行中的第二个值4

如果您还有其他问题,请仔细查看并告诉我。


推荐阅读