4

我有这个代码:

#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;
}

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

gcc: LengthOfArray.c:7: [Warning] assignment from incompatible 
                         pointer type [enabled by default]

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

那么正确的方法是什么?

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

4

3 回答 3

5

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

由于p2_arr指向一个大小为 10 的数组,您需要分配一个大小为 10 的数组的地址

int (*p2_arr)[10] = &arr;   
于 2013-10-18T16:16:57.973 回答
4

arr(与任何数组一样)衰减为指向其第一个元素的指针(而不是指向数组本身的指针),即int *. 要获得正确的行为,请获取其地址,如下所示:

p2_arr = &arr;
于 2013-10-18T16:17:43.320 回答
2

为什么编译器说从不兼容的指针类型赋值

  • arr转换为指向 int 的类型指针

    数组的名称衰减为类型的指针,指向pointer-to-T数组的第一个元素。(例外情况是:当数组是sizeofor&运算符的操作数,或者是字符数组的字符串字面量初始值设定项时。请阅读T是数组元素的类型。

  • p2_arr指向 10 int 数组的指针类型

    这是不言自明的,从您的声明中可以清楚地看到p2_arr

因此,您不能分配arrp2_arr


解决方案:

现在,要将有效的指针表达式分配给p2_arr,您将需要10 int 数组的地址

  • &arr指向 10 int 数组的指针类型

你可以做,

int (*p2_arr)[10] = &arr;
于 2013-10-18T16:42:26.770 回答