Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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语言中指向2D数组的指针_C_Arrays_Pointers - Fatal编程技术网

C语言中指向2D数组的指针

C语言中指向2D数组的指针,c,arrays,pointers,C,Arrays,Pointers,我是C编程新手,几天来一直在寻找这个问题 int arr[][2]={11,22,33,44,55,66}; int (*ptr)[2]=&arr[1]; //line a int (*ptr1)[2]=arr[1]; //line b 对于第(a)行,编译器没有问题,但对于第(b)行,它给出了错误,无法将int*转换为int[2]* 现在&arr[1]和arr[1]的大小都相同(当我签入sizeof操作符时) 所以请帮我理解到底发生了什么?arr[1]和&arr[1]之间

我是C编程新手,几天来一直在寻找这个问题

int arr[][2]={11,22,33,44,55,66};
int (*ptr)[2]=&arr[1];    //line a
int (*ptr1)[2]=arr[1];    //line b
对于第(a)行,编译器没有问题,但对于第(b)行,它给出了
错误,无法将int*转换为int[2]*

现在
&arr[1]
arr[1]
的大小都相同(当我签入sizeof操作符时)

所以请帮我理解到底发生了什么?
arr[1]
&arr[1]
之间有什么区别?谢谢大家!

“相同大小”并不意味着“相同类型”。大小相同的有各种类型

arr[1]
具有类型
int[2]
。因此
&arr[1]
具有类型
int(*)[2]
,因此
行a
是可以的

使用数组类型的表达式时,如果该表达式不是
&
sizeof
的操作数,它将进行左值到右值的转换,此转换的结果是指向数组第一个元素的指针。(这有时被称为衰变)

因此,在
行b
上,经过衰减后,
arr[1]
&arr[1][0]
相同,其类型为
int*
。这与
int(*)[2]
不兼容,因此分配失败

指针的兼容类型的定义是(意译)类型相同。除了
void*
之外的不兼容指针之间的任何赋值都需要强制转换(并且可能不会达到预期效果)


要进一步阅读,请检查并搜索此网站,以查找有关此主题的高评分问题。

请参见此处,它应该会有所帮助:非常感谢。我不知道这个衰减概念,因此此答案非常有用。