Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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 数组上不兼容指针类型警告的赋值_C_Linux_Pointers_Gcc - Fatal编程技术网

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];