如果将int(*p_arr)[10]定义为指向大小为10的数组的指针,那么为什么编译器会在这种情况下显示警告?

Don*_*ild 4 c arrays gcc pointer-to-array

我有这个代码:

#include <stdio.h>

int main()
{
    int arr[10] = {0};
    int *p1_arr = arr;
    int (*p2_arr)[10] = arr;      // Line 7, Shows Warning here

    ...

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在编译gcc使用时gcc -g -Wall LengthofArray.c,它显示以下警告:

gcc: LengthOfArray.c:7: [Warning] assignment from incompatible 
                         pointer type [enabled by default]
Run Code Online (Sandbox Code Playgroud)

我的问题是if int (*p2_arr)[10]是一个指向大小为10的数组的指针,那么为什么编译器显示这个警告?

那么正确的方法是什么呢?

我在Windows 7 32位(DevC++)上使用了gcc 4.7.2,
并在SLES 10.3 x86_64上检查了gcc 4.1.2

alk*_*alk 5

...如果int(*p2_arr)[10]是指向大小为10的数组的指针 ...

作为p2_arr指向大小为10的数组,您需要指定一个大小为10的数组的地址:

int (*p2_arr)[10] = &arr;   
Run Code Online (Sandbox Code Playgroud)

  • @ 0xF1:数组的名称命名数组,而不是`int`指针.在大多数表达式中,数组**被**转换为指向其第一个元素的指针,但不是全部.所以你可以看到数组的名称确实在`sizeof`,`&`和`_Alignof`表达式中命名数组. (3认同)