下面是一个二维数组的例子。
int s[5][2] = {
{0, 1},
{2, 3},
{4, 5},
{6, 7},
{8, 9}
};
int (*p)[2];
如果我写 p = &s[0];
没有错误。但是如果我写 p = s[0];
就会出错,即使 &s[0]
和 s[0]
会给出同一个地址。
请告诉我为什么会有差异,即使两者都提供相同的地址。
最佳答案
地址相同,但类型不同。
&s[0]
是 int (*)[2]
类型,但是 s[0]
是 类型int [2]
,衰减为 int *
。
结果是,当对 p
执行算术运算时,它遍历数组的模式将取决于它的类型。如果您编写 p = &s[0]
然后访问 p[3][1]
,则您正在访问 s[3][1]
。另一方面,如果您编写 int *q = s[0]
,则只能使用 q
访问 s
的第一个子数组,例如q[1]
将访问 s[0][1]
。
关于c - 指向数组的指针地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13119972/