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;
为什么编译器说赋值来自不兼容的指针类型?
被转换为指向int的类型指针 数组的名称衰减为指向数组第一个元素的类型为“arr
”的指针。(例外情况是:当数组是pointer-to-T
或sizeof
运算符的操作数,或者是字符数组的字符串文字初始值设定项时。Read)&
是数组元素的类型T
是指向10 int数组的指针类型 这是不言自明的,从您的p2_arr
p2\u arr
arr
分配给p2\u arr
解决方案: 现在,要为
p2\u arr
分配一个有效的指针表达式,您需要10 int数组的地址
是指向10 int数组的指针类型&arr
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;