我有这段代码,我试图找出第二行代码的作用。
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语言的指针有基本的了解,您能解释一下第二行代码做什么吗?
答案 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]