我有一个问题:
为什么这会引发错误(无法从int*转换为int[5](
int static_Array[5];
int *dynamic_Array;
dynamic_Array = new int[5];
static_Array = dynamic_Array;
这还可以吗?
int static_Array[5];
int *dynamic_Array;
dynamic_Array = new int[5];
dynamic_Array = static_Array; //This line changed
我猜编译器可以将类型int转换为int*?但是,为什么编译器不能将int转换为int*呢?
有人能提供实际的解释吗?
谢谢!
当在需要指针的上下文中指定原始数组时,它会转换为指向第一项的指针(从产生指针值的意义上讲(,这被称为类型衰减。
不发生这种情况的上下文包括sizeof
表达式、typeid
表达式以及绑定到数组引用。
但从本质上讲,这意味着原始数组是不可赋值的,当然也不能为数组变量分配指针,因为结果应该是什么
但是,如果将数组放在struct
中,则可以指定struct
。这就是std::array
。但是当您想要一个可分配的动态大小数组时,请使用std::vector
。
顺便说一下,函数也存在类似类型的衰变。
这个:
int static_Array[5];
int *dynamic_Array = new int[5]; // 1.
dynamic_Array = static_Array; // 2.
- 动态分配数组并将第一个元素的地址存储在指针
dynamic_Array
中 - 用
static_Array
的第一个元素的地址覆盖此地址
但是这个:
int static_Array[5];
int *dynamic_Array = new int[5];
static_Array = dynamic_Array;
尝试使用地址初始化数组(因此编译器会给出关于无效指针到数组转换的错误(。
为什么第一个有效
因为静态数组(右侧(立即衰减为指针。这不能以另一种方式工作,不能保证此指针指向数组。
int static_Array[5];
这里static_Array是指向static_Array[0]的const指针,您不能像那样修改它
static_Array = dynamic_Array;