Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如果int(*p_arr)[10]被定义为指向大小为10的数组的指针,那么为什么编译器在这种情况下显示警告?_C_Arrays_Gcc_Pointer To Array - Fatal编程技术网

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

C 如果int(*p_arr)[10]被定义为指向大小为10的数组的指针,那么为什么编译器在这种情况下显示警告?,c,arrays,gcc,pointer-to-array,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; } 我的问题是,如果int(*p2_arr)[10]是指向大小为10的数组的指针,那么为什么编译器会显示此警告 那么正确的方法是什么呢

我有以下代码:

#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;
}
我的问题是,如果
int(*p2_arr)[10]
是指向大小为10的数组的指针,那么为什么编译器会显示此警告

那么正确的方法是什么呢

我在Windows7 32位(DevC++)上使用了GCC4.7.2
还检查了SLES 10.3 x86_64上的gcc 4.1.2

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

由于
p2\u arr
指向一个大小为10的数组,您需要为一个大小为10的数组分配一个地址:

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

p2_arr = &arr;
为什么编译器说赋值来自不兼容的指针类型?
  • arr
    被转换为指向int的类型指针

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

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

    这是不言自明的,从您的
    p2\u arr

因此,您不能将
arr
分配给
p2\u arr


解决方案: 现在,要为
p2\u arr
分配一个有效的指针表达式,您需要10 int数组的地址

  • &arr
    是指向10 int数组的指针类型
你可以

int (*p2_arr)[10] = &arr;

对,我搞糊涂了。数组的名称是
int
指针,而不是指向
10 int数组的指针。无论如何,谢谢。@0xF1:数组的名称命名数组,而不是
int
指针。在大多数表达式中,数组被转换为指向其第一个元素的指针,但不是所有表达式。因此,您可以看到数组的名称确实在<代码> sieOfs<代码>中命名数组,<代码>和<代码>,和<代码>对齐> < /Calp>表达式。@ TFNEGNA这是C,而不是C++。如果您将任何(非限定的)对象指针类型指定给
void*
@tfininga Um what,则不会发出警告?那是错误的
arr
&arr[0]
不同,它只是被隐式转换成这样。(如果你不知道发生了什么,不要投反对票…@tfininga,即使是这样:你的“推理”简直是胡说八道。那些“严格的类型”是怎么回事?完全错了。只是OP试图给一个指向不兼容类型的指针赋值。@Tfiniga(至于为什么解释是胡说八道的:这是一个经典的非sequeur。没有“更严格的类型”这样的东西),只有兼容和不兼容的类型。我建议您先阅读标准的相关部分,然后再以不公正的方式批评其他人的答案。)在仔细阅读问题和您的答案后,我必须道歉。我误解了你的答案,我现在认为你的答案是正确的。@tfininga我已经编辑了我的答案,所以它没有被锁定-如果你投了反对票,你能撤销它吗?要理解的是
&arr
arr
在语义上都是不同的。(当然,如果使用
%p
打印,则值相同)。请阅读
int (*p2_arr)[10] = &arr;