8

下面是一个二维数组的例子。

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]

请让我知道为什么会有差异,即使两者都给出相同的地址。

4

3 回答 3

17

地址相同,但类型不同。

&s[0]是类型的int (*)[2],但是s[0]是类型的int [2],衰减到int *.

结果是,在对 执行算术运算时p,它遍历数组的模式将取决于它的类型。如果你先写p = &s[0]然后访问p[3][1],你就是在访问s[3][1]。另一方面,如果您编写int *q = s[0],则只能使用q访问seg的第一个子数组q[1]将访问s[0][1]

于 2012-10-29T10:43:51.463 回答
0

关闭,但不完全。s 是指向数组第一个元素的指针。它也是该数组的别名——编译器知道它指向特定数量的元素。

因此,&s[0] 返回第一个元素的地址,而 s[0] 返回元素本身。

*p 然而只是一个指向 int 的指针。它可能比这更多的元素,但编译器肯定不知道。

于 2012-10-29T10:46:11.770 回答
-2

当您尝试将数据类型分配(int *)给不同的数据类型时,gcc(int **)会显示警告。不确定其他编译器。

于 2012-10-29T10:44:40.647 回答