这里有新手问题...为什么下面的代码只适用于1D数组但不适用于2D数组? b是否指向1D数组或2D数组的开头不应该没有区别,只要它是char *指针(就像它)?我认为通用符号[bound1] [bound2]相当于[bound1 * bound2],即使在赋值操作上也是如此。帮助
main() //this works fine
{
char *b;
b = new char[50];
return 0;
}
main() //but this raises the error "Cannot convert char(*)[50] to char* in assignment"
{
char *b;
b = new char[50][50];
return 0;
}
答案 0 :(得分:1)
char[50];
是包含char
类型的50个元素的数组。每个元素都有char
类型。因此new char[50];
返回指向第一个元素的指针:char *
- 指向char
的指针。
char[50][50]
不是char
的数组。它是数组的数组。每个元素都有char[50]
类型。因此new char[50][50];
返回指向第一个元素的指针:char (*)[50]
- 指向char[50]
的指针。
以这种方式声明b
:
char (*b)[50];
答案 1 :(得分:0)
如果你对[bound1] [bound2]和[bound1 * bound2]是正确的,你就不会创建一个2D数组。分配内存的大小,这是你的乘法所暗示的,这不是问题,它是关于不同的数据类型:一维数组根本不是一个二维数组,这就是编译器告诉你的。您应该阅读有关C ++类型系统和类型安全性的信息。
What is type safety and what are the "type safe" alternatives?