1

这里的新手问题...为什么以下代码仅适用于一维数组而不适用于二维数组?b 是指向一维数组还是二维数组的开头,只要它是一个 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;
}
4

2 回答 2

0

char[50];是类型为 50 个元素的数组char。每个元素都有类型char。所以new char[50];返回一个指向第一个元素的指针:char *- 指向char.

char[50][50]不是数组char。它是数组的数组。每个元素都有类型char[50]。所以new char[50][50];返回一个指向第一个元素的指针:char (*)[50]- 指向char[50].

b以这种方式声明:

char (*b)[50];

测试:http: //ideone.com/1zJs1O

于 2013-10-26T13:40:01.420 回答
0

如果您认为 [bound1][bound2] 和 [bound1*bound2] 是等价的,您就不会创建二维数组。分配内存的大小,这就是你的乘法所暗示的,不是这里的问题,它与不同的数据类型有关:一维数组根本不是二维数组,这就是编译器告诉你的。您应该阅读有关 C++ 类型系统和类型安全的信息。

什么是类型安全以及“类型安全”的替代方案是什么?

于 2013-10-26T13:41:52.810 回答