【问题标题】:Address of pointer to an array指向数组的指针的地址
【发布时间】:2012-10-18 16:04:25
【问题描述】:

下面是二维数组的例子。

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] 会给出相同的地址。

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

【问题讨论】:

  • 为了使问题完整,最好发布您收到的错误消息。
  • С 是一种类型化 语言,这意味着它严格控制所分配值的类型。仅仅因为两个地址相同并不意味着它们在类型上是兼容的。

标签: c arrays pointers multidimensional-array


【解决方案1】:

地址相同,但类型不同。

&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]

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 哦,是的,当然。哎呀! p 是指向 int 的点数组,对吗?天哪,我已经很久没有每天使用强类型语言了。 :笑着想象如果他现在在做 COM 工作会发生什么繁荣,计算机爆炸?:
    • *p 的类型是int 的数组2。评估时,数组*p 被转换为指向int 的指针。
    【解决方案3】:
    当您尝试将数据类型 (int *) 分配给不同的数据类型 (int **) 时,

    gcc 会显示警告。不确定其他编译器。

    【讨论】:

    • 这并不重要。 C 不区分“警告”和“错误”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    相关资源
    最近更新 更多