【问题标题】:Pointer to an array giving incompatible pointer type warning指向给出不兼容指针类型警告的数组的指针
【发布时间】:2013-07-05 07:01:40
【问题描述】:

当我编译以下代码时,我得到了warning: assignment from incompatible pointer type [enabled by default]

int main() {
     int (*aptr) [5] = NULL;
     int arr[5] = {1,2,3,4,5};

     aptr = &arr[0];

     printf("aptr = %p\n arr = %p\n", aptr, &arr[0]);
     return 0;
}

我得到了正确的输出:

aptr = 0xbfcc2c64
arr = 0xbfcc2c64

但是为什么我会收到指针类型不兼容的警告?

【问题讨论】:

标签: c pointers


【解决方案1】:

您声明了一个指向整个数组的指针。你为什么要让它指向第一个元素

如果你想用int (*)[5] 类型声明你的aptr,就像你的例子一样,并让它指向arr,那么这就是你应该设置指针值的方式

aptr = &arr;

您现在在代码中尝试将int * 值分配给int (*)[5] 类型的指针。这些是不同的类型,这就是您收到警告的原因(实际上是违反约束,AKA 错误)。

【讨论】:

  • 感谢您的回复,警告已删除。只是一个小的澄清, &arr 是数组的地址。 &arr[0] 是数组中第一个元素的地址,从概念上讲,它们都拥有相同的地址。不是吗?我试图打印值 &arr 和 &arr[0] 打印出来, &arr = 0xbfa092e4 &arr[0] = 0xbfa092e4 如果是愚蠢的问题,请原谅。
  • @user2552690:是的,纯粹从数字上讲,整个数组的地址始终与其第一个元素的地址相同。然而指针的类型是不同的。其结果之一是,指针算法对此类指针的工作方式不同,例如。尝试打印&arr + 1&arr[0] + 1,您会看到区别。
  • 还有一个查询。我期待 *aptr 会给我数组中第一个元素的值。但我需要 **aptr 来获取数组中第一个元素的值。为什么? aptr = 0xbfdbf7e4 *(aptr) = 0xbfdbf7e4 **(aptr) = 1
  • @user2552690:好吧,那将是同样的错误。 aptr 是一个指向整个数组的指针。这意味着*aptr 是数组本身,而不是第一个元素。换句话说,*aptrarr 是一回事。为了访问第一个元素,您必须执行(*aptr)[0](参见arr[0])或**aptr(参见*arr)。这里没有什么奇怪的:为了得到aptr,您必须使用& 运算符。现在,为了返回数组,您必须使用额外的 * 来“补偿”该 & 运算符。
【解决方案2】:

数组名本身给出了不需要使用&arr的基地址。而且arr[0]表示第一个索引处的值。

【讨论】:

    猜你喜欢
    • 2018-11-23
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    相关资源
    最近更新 更多