C++类中二维数组赋值疑问:为何data = DATA可执行?
为什么构造函数中的
data = DATA可以运行? 核心原因是函数参数中的二维数组会发生类型退化,而你直接赋值数组的代码是真正的数组类型赋值,两者本质完全不同。
1. 函数参数中二维数组的类型退化
在C/C++中,当你把二维数组作为函数参数传递时,T DATA[N][N]这种写法会被编译器自动解析为T (*DATA)[N]——也就是一个指向长度为N的T类型一维数组的指针,而非真正的二维数组类型。
这是C/C++的数组参数退化规则:
- 一维数组参数
T arr[M]等价于T* arr - 二维数组参数
T arr[M][N]等价于T (*arr)[N](因为二维数组是"数组的数组",退化后指向内部的一维数组)
2. 构造函数中的赋值本质是指针赋值
你的arrayNN类中,成员变量data的类型应该是T (*data)[N](和退化后的DATA类型完全匹配)。此时data = DATA只是把DATA这个指针的值(也就是传入的二维数组的首地址,即第一个一维数组的地址)赋值给data指针,这是完全合法的指针赋值操作,和普通的指针赋值没有区别。
3. 直接数组赋值为什么失败?
你给出的错误例子:
double b[3][3]; b = array;
这里的b和array都是真正的double[3][3]数组类型。在C/C++中,数组类型是不可赋值的左值——你不能直接把一个数组整体赋值给另一个数组,这是语法规则明确禁止的,所以这行代码会编译报错。
简单总结:构造函数里的赋值是指针之间的赋值,而直接数组赋值是试图给数组类型赋值,两者不是一回事。
内容的提问来源于stack exchange,提问作者MIKE PAPADAKIS
相关产品推荐
相关产品推荐

