来自数组的不兼容指针类型警告的分配

时间:2019-01-22 14:45:19

标签: c linux pointers gcc

为什么下面的代码会发出警告?

#include <stdio.h>
int main()
{
    int arr[3] = {1,2,3};
    int *ptr, *ptr1;
    ptr = &arr;
    ptr1 = arr;
    printf("ptr is %p\t ptr1 is %p\n",ptr, ptr1);
    ptr++;
    ptr1++;
    printf("ptr is %p\t ptr1 is %p\n",ptr, ptr1);
    return 0;

}
$ gcc test.c -o test
test.c: In function ‘main’:
test.c:6:6: warning: assignment from incompatible pointer type [enabled by default]
  ptr = &arr;

我还尝试将ptr更改为int **ptr,但仍然失败,并显示相同的警告。 arr是一个指针;我将其存储在指针中。这是怎么回事?

2 个答案:

答案 0 :(得分:2)

  

arr是一个指针

不,不是。

MSVC(令人惊讶地)对此代码给出了更详细的警告:

warning C4047: '=': 'int *' differs in levels of indirection from 'int (*)[3]'

不带下标的语法&array包含长度信息。将分配更改为&arr[0]会删除警告,它会按预期工作。

答案 1 :(得分:1)

C数组非常类似于指针。它们都引用内存中的地址,并且在访问数据时表现相同。实际上,一个重要的区别是,指针可以显示内存中的任何地址,而数组是内存中块开头的地址,并且不能将其重新分配给另一个地址。 因此,“ arr”已经是一种指针,如果您要将其关联到另一个指针,只需使用:

int* ptr = arr;

您不需要地址运算符,但是您也可以通过访问第一个元素并在其上使用地址运算符来获得指向第一个值的指针。

int* ptr = &arr[0];

请确保不要说array =指针。但是它们有共同点。