这是该论坛中“ Some Programme dude”回答的扩展问题。 Accessing 2D array elements using pointer arithmetic in C
要引用答案,
- &s [0] [0]。这是int *类型。
- &s [0]。类型为int(*)[2]。
- s [0]。这将衰减为指向s [0]中第一个元素的指针,并且等于1。
- s。这将衰减为指向s中第一个元素的指针,等于2。
- &s。指向数组的指针,类型为int(*)[4] [2]。
我不明白为什么3等于1,而4等于2?
我认为3等于2,而4等于5。
例如,将s [0]放入s [0]的地址,因为它是一个数组,因此s [0] =&s [0]。
答案 0 :(得分:0)
让我们看一下您的2D数组,并考虑您所询问的各种变量的类型:
int s[4][2] = {
{1234,56},
{1212,13},
{1434,80},
{1312,78}
};
现在:
s
是一个二维整数数组。s[0]
,s[1]
等是整数数组。您的问题状态:
放入s [0]将给出s [0]的地址,因为它是一个数组,因此 s [0] =&s [0]
这是不正确的。在表达式中使用时,数组的名称会衰减为指向该数组的 first元素的指针。 s
的第一个元素是什么?它是整个数组s[0]
。
由于s[0]
是一个 array ,因此它等效于其第一个元素的地址。数组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)。
正如“一些程序员花花公子”在他对原始问题的回答中的图表中所示,这些各种指针可能指向内存中的同一位置,但从语义上讲它们是完全不同的。
希望这会有所帮助!