You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++数组指针赋值:为何第二行与最后一行出现编译错误?

问题解答

先看你给出的测试代码:

void test(){
    int array[10]{};
    int (*i)[10] = &array; // works
    int (*j)[10] = array;  // does not work
    int *k = array;     // works
    int *l = new int[10](); // works
    int (*m)[10] = new int[10]();      // does not work
    exit(0);
}

针对你的两个疑惑,解答如下:

1. 为什么array和&array地址相同,但不加&无法赋值?

核心原因是两者的类型完全不同:

  • 数组名array在绝大多数语境下会发生隐式类型转换,变成指向数组首元素的指针,类型是int*。
  • &array是取整个数组的地址,得到的是指向int[10]整个数组的指针,类型是int (*)[10]。

C++是强类型语言,不允许直接把int*类型的值赋值给int (*)[10]类型的变量——哪怕它们的地址值完全一致。所以int (*j)[10] = array;会触发类型不匹配的编译错误,而int (*i)[10] = &array;因为类型完全匹配,所以能正常编译。

2. 最后一行报错的原因是什么?

不是编译器无法识别动态数组类型,而是new int[10]()的返回类型和变量m的类型不匹配:

  • new int[10]()动态分配一个包含10个int的数组,返回的是指向数组首元素的指针,类型为int*。
  • 变量m的类型是int (*)[10](指向int[10]数组的指针),两者类型不兼容,因此编译报错。

如果要让赋值合法,需要让new的返回类型匹配m的类型,可以写成:

int (*m)[10] = new int[1][10]();

这里new int[1][10]()分配的是一个包含1个int[10]数组的二维数组,返回的就是int (*)[10]类型的指针,和m的类型一致,就能正常编译。

内容的提问来源于stack exchange,提问作者user18348324

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 10:35:16