代码之家  ›  专栏  ›  技术社区  ›  md.jamal

来自数组上不兼容指针类型警告的赋值[重复]

  •  -1
  • md.jamal  · 技术社区  · 5 年前

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

    #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 回复  |  直到 5 年前
        1
  •  1
  •   Leon0402    5 年前

    C数组与指针非常相似。它们都引用内存中的地址,并且在访问数据时行为相同。事实上,一个重要的区别是指针可以显示到内存中的任何地址,而数组是指向内存中块开头的地址,不能重新分配到另一个地址。 所以“arr”已经是一种指针,如果你想将它赋给另一个指针,只需使用:

    int* ptr = arr;
    

    您不需要adress操作符,但也可以通过访问第一个元素并在其上使用adress操作符来获取指向第一个值的指针。

    int* ptr = &arr[0];
    

    请确保不要说array=pointer。但他们有共同点。

        2
  •  2
  •   Govind Parmar    5 年前

    arr是一个指针

    不,不是。

    MSVC(出人意料地)对此代码给出了更详细的警告:

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

    句法 &array 如果没有下标,则包含长度信息。将工作分配更改为 &arr[0] 删除警告并按预期工作。