构造函数为何无法接收new初始化的二维数组作为参数?
为什么动态分配的
int**数组无法传给接收int m[5][5]的构造函数? 这事儿核心是静态二维数组和你用int**动态分配的数组,根本不是同一种类型——虽然看起来都是“二维数组”,但内存布局和类型本质完全不一样,编译器可不认这种“表面相似”。
先搞清楚构造函数的参数实际是什么
你写的构造函数参数int m[5][5],在C++里会被编译器自动转换成int (*m)[5]——也就是一个指向包含5个int的一维数组的指针。记住这个类型,后面对比的时候要用到。
静态数组int k[5][5]为什么能正常传?
静态声明的二维数组,在内存里是连续的一整块空间:25个int挨在一起,排成一个完整的“长条”。当你把k传给构造函数时,它会隐式转换成指向第一个“5元素int数组”的指针,类型正好是int (*)[5],和构造函数的参数类型完全匹配,编译器自然开开心心接受了。
你用int**动态分配的数组为啥不行?
你写的这段动态分配代码:
int **d=new int*[5]; for(int i=0;i<5;i++){ d[i]=new int[5]; }
它的内存布局是“分散式”的:
- 先分配了一块存5个
int*的连续空间(相当于一个指针数组) - 然后每个
int*又分别指向一块独立的、存5个int的小空间
也就是说,d本身是int**类型——指向指针的指针,和构造函数需要的int (*)[5](指向一维数组的指针)是完全不兼容的类型,编译器没法把它们隐式转换,自然就报错了。
那要怎么动态分配才能适配这个构造函数?
如果想动态分配出能匹配int m[5][5]参数的数组,可以直接这样写:
int (*d)[5] = new int[5][5];
这样分配出来的是一块连续的25个int的空间,d的类型就是int (*)[5],和构造函数的参数类型完美匹配,就能正常传进去了。
内容的提问来源于stack exchange,提问作者user9806643
相关产品推荐
相关产品推荐

