这是一个来自本论坛“一些程序员家伙”答案的延伸问题。 Accessing 2D array elements using pointer arithmetic in C
引用回答者,
- &S [0] [0]。这是int *类型。
- &S [0]。这是int(*)[2]类型。
- S [0]。这将衰减为指向s [0]中第一个元素的指针,并且等于1。
- 秒。这将衰减为指向s中第一个元素的指针,并且等于2。
- &S。指向数组的指针,类型为int(*)[4] [2]。
我不明白为什么3等于1和4等于2?
我认为3等于2和4等于5。
例如,输入s [0]将给出s [0]的地址,因为它是一个数组,因此s [0] =&s [0]。
我们来看看您的2D数组,并考虑您询问的各种变量的类型:
int s[4][2] = {
{1234,56},
{1212,13},
{1434,80},
{1312,78}
};
现在:
s
是一个二维数组的整数。s[0]
,s[1]
等是int的数组。你的问题陈述:
put [0]将给出s [0]的地址,因为它是一个数组,因此s [0] =&s [0]
这是不正确的。在表达式中使用时,数组的名称会衰减为指向数组第一个元素的指针。 s
的第一个元素是什么?它是整个阵列s[0]
。
由于s[0]
是一个数组,因此它等同于第一个元素的地址。数组s[0]
的第一个元素是什么?这是int s[0][0]
。因此,当在表达式中使用时,数组名称s[0]
的值等于数组的第一个元素的地址,即s[0][0]
,我们有:
s[0] == &s[0][0]
这就是为什么(3)在你引用的答案中等同于(1)。
同样,s
相当于&s[0]
。当在表达式中使用时,数组名称s
衰减为指向整个数组s[0]
的指针;作为指向两个int
元素数组的指针,它的类型是int (*) [2]
。它的值是&s[0]
的地址,即整个数组的地址(不仅仅是它的第一个元素)。这就是为什么(4)等同于(2)。
正如“一些程序员家伙”在图中对原始问题的回答所示,这些不同的指针可能指向内存中的相同位置,但在语义上它们是完全不同的。
希望这可以帮助!