C ++为彼此分配数组; type int * = type int有效但不是int = int *?

时间:2014-03-20 01:30:55

标签: c++ arrays pointers int assign

我有一个问题:

为什么会抛出错误(无法从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 *?

任何人都可以提供实际解释吗?

谢谢!

3 个答案:

答案 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.
  1. 动态分配数组并将第一个元素的地址存储在指针dynamic_Array
  2. 使用static_Array
  3. 的第一个元素的地址覆盖此地址

    但是这个:

    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;