C 数组上不兼容指针类型警告的赋值
为什么下面的代码会给出警告C 数组上不兼容指针类型警告的赋值,c,linux,pointers,gcc,C,Linux,Pointers,Gcc,为什么下面的代码会给出警告 #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,
#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;
}
我还尝试将ptr更改为int**ptr,但仍然失败,并发出相同的警告。arr是指针;我将它存储在一个指针中。这里出了什么错
arr是指针
不,不是
令人惊讶的是,MSVC对此代码给出了更详细的警告:
warning C4047: '=': 'int *' differs in levels of indirection from 'int (*)[3]'
不带下标的语法和数组包含长度信息。将赋值更改为&arr[0]将删除警告,并按预期工作。C数组与指针非常相似。它们都引用内存中的地址,在访问数据时表现相同。事实上,一个重要的区别是指针可以显示内存中的任何地址,而数组是内存中块开头的地址,不能重新分配给另一个地址。 因此,arr已经是一种指针,如果您想将其分配给另一个指针,只需使用:
int* ptr = arr;
您不需要adress运算符,但也可以通过访问第一个元素并在其上使用adress运算符来获取指向第一个值的指针
int* ptr = &arr[0];
请确保不要说array=pointer。但是他们有共同点。你想做什么?ptr1是正确的选择。不,这绝对不是唯一的区别。不要说数组是指针,因为它们不是。是的,当然还有一些不同,只是可能很难。我会编辑它。我只想保持简单,数组与指针非常相似,这可能是我给出的最重要的原因。这有助于理解为什么代码必须是这样,如果你将数组与指针进行比较,即使在这种情况下,一个非常常见的问题来源是人们不理解指针和数组之间的区别,因此我认为不要给人留下它们是相同的印象是非常重要的。是的,你绝对正确!另一方面,人们通常也难以接受数组在某些方面的行为,比如指针,特别是当它们来自Java等语言时。所以我想,我们需要找到中间点,告诉人们他们不一样,但有共同点。指出相似性和差异以及数组何时衰减为指针是理解C的关键之一。
int* ptr = &arr[0];