C语言中指向2D数组的指针
我是C编程新手,几天来一直在寻找这个问题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]之间
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*
之外的不兼容指针之间的任何赋值都需要强制转换(并且可能不会达到预期效果)
要进一步阅读,请检查并搜索此网站,以查找有关此主题的高评分问题。请参见此处,它应该会有所帮助:非常感谢。我不知道这个衰减概念,因此此答案非常有用。