我有一个问题:
为什么会抛出错误(无法从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 *?
任何人都可以提供实际解释吗?
谢谢!
答案 0 :(得分:2)
当在期望指针的上下文中指定原始数组时,它会转换为指向第一个项目的指针(在生成该指针值的意义上),这称为类型衰减。
没有发生的情况包括sizeof
表达式,typeid
表达式和对数组引用的绑定。
但基本上这意味着原始数组不可分配,当然你不能指定一个数组变量的指针,结果应该是什么。
但是,如果您将数组放在struct
中,则可以指定struct
。这就是std::array
的含义。但是当您需要可分配的动态大小数组时,请使用std::vector
。
顺便说一下,函数的类型也有类似的衰减。
答案 1 :(得分:1)
这一个:
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;
尝试使用地址初始化数组(因此编译器会提供有关指向数组转换的无效指针的错误)。
那么为什么第一个有效?
因为静态数组(在右侧)立即衰减到指针。这不能以其他方式工作,不能保证这个指针指向一个数组。
答案 2 :(得分:0)
int static_Array[5];
这里static_Array是指向static_Array [0]的const指针,你不能修改它,
static_Array = dynamic_Array;