如何理解C语言中指向数据结构的指针?

时间:2019-01-07 19:33:09

标签: 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语言的指针有基本的了解,您能解释一下第二行代码做什么吗?

2 个答案:

答案 0 :(得分:2)

您的table只是2D整数数组。在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 Standard - 6.3.2.1 Other Operands - Lvalues, arrays, and function designators(p3)

问题中将向您介绍“ 指针符号”。您可以使用“ 数组索引”或“ 指针符号”来访问数组的任何元素。指针符号*(a + b)与数组索引符号的a[b]等效。你有:

*(*(table+2)+1)

如果您一步一步地使用*(table + 2)就是table[2]。接下来的*(table[2] + 1)就是table[2][1]。因此,您要在第三行中使用第二个值(简称为4)。

仔细检查一下,如果还有其他问题,请告诉我。

答案 1 :(得分:1)

table是由3个数组组成的4个int的数组。

在表达式中使用数组时,除以下情况外,它将转换为指向其第一个元素的指针:

  • 它是sizeof的操作数。
  • 它是一元&的操作数。
  • 这是用于初始化数组的字符串文字。

因此,在*(*(table+2)+1)中,table被转换为指向其第一个元素的指针,从而产生&table[0]。然后我们有:

*(*(&table[0]+2)+1)

接下来,我们添加了&table[0] + 2。这使用指针算法。向指针添加整数(到数组中)可将指针向后或向前移动多个元素。因此&table[0] + 2产生了指向table[2]的指针&table[2]。然后我们有:

*(*(&table[2])+1)

不再需要内括号,所以我们有:

*(*&table[2]+1)

然后* &table[2]&table[2]指向的东西,这意味着它是table[2]

*(table[2] + 1)

由于table是3个4 int的数组,所以table[2]是4 int的数组。由于它是一个数组,因此将其转换为指向其第一个元素的指针,从而产生&table[2][0]

*(&table[2][0] + 1)

现在,我们又有了指针算法。 &table[2][0]是指向数组table[2]的元素0的指针,因此加1会生成指向元素1的指针,&table[2][1]

*(&table[2][1])

再次,我们有了不再需要的括号:

*&table[2][1]

最后,* &table[2][1]就是&table[2][1]指向的东西,所以它就是:

table[2][1]