【问题标题】:Pointer to a 2D array in C [duplicate]指向C中的二维数组的指针[重复]
【发布时间】:2014-11-20 22:41:54
【问题描述】:

我是 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) 行,它给出 ERROR-cant convert int* to int[2]*

现在&arr[1]arr[1] 的大小相同(当我签入 sizeof 运算符时)。

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

【问题讨论】:

标签: c arrays pointers


【解决方案1】:

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

arr[1] 具有类型 int[2] 。所以&arr[1]int(*)[2] 类型,所以line a 没问题。

当你使用数组类型的表达式并且它不是&sizeof的操作数时,它会进行左值到右值的转换,转换的结果是指向第一个元素的指针大批。 (这有时称为衰减)。

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

指针的兼容类型的定义是(解释)类型是相同的。除了void * 之外的不兼容指针之间的任何分配都需要强制转换(并且可能不会达到您的预期)。

如需进一步阅读,请查看the C FAQ,或许还可以在此网站上搜索有关该主题的高评分问题。

【讨论】:

  • 非常感谢。我不知道这个衰变概念,所以这个答案真的很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 2021-08-23
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
相关资源
最近更新 更多