如何将指针数组的引用作为函数参数?类型转换报错求解
如何将指针数组的引用作为函数参数编写?
- Class B 可以正常运行:它的构造函数接收整数数组的引用作为参数。
- Class A 运行失败:它的构造函数尝试接收指向整数的指针数组的引用作为参数。
原代码
#include <iostream> int a = 1; int b = 2; int arr[2] = { 1, 2 } ; int * parr[2] = { &a, &b }; class B // works { int * parr_; B(int (&arr)[2] ) { parr_ = arr; } }; class A // doesn't work! { int ** pparr_; A(int (*&pparr)[2] ) { pparr_ = pparr; //error } };
报错信息
ERROR! g++ /tmp/K0oKZ2yIsn.cpp /tmp/K0oKZ2yIsn.cpp: In constructor 'A::A(int (*&)[2])': /tmp/K0oKZ2yIsn.cpp:25:16: error: cannot convert 'int (*)[2]' to 'int**' in assignment 25 | pparr_ = pparr; | ^~~~~ | | | int (*)[2]
报错原因
核心问题是类型不匹配:你声明的参数类型int (*&pparr)[2]是指向包含2个int元素的数组的指针的引用,但实际传入的parr是包含2个int*元素的数组,其类型为int*[2]。同时,int (*)[2]无法直接转换为int**,导致赋值失败。
修正方案
要正确接收指针数组的引用,参数类型应该写成int* (&pparr)[2]——这才是对int*[2]类型数组的引用。数组名可以隐式转换为指向第一个元素的指针,此时pparr会转为int**,可以直接赋值给pparr_。
修正后的Class A代码:
class A // 现在可以正常运行 { int ** pparr_; A(int* (&pparr)[2] ) { pparr_ = pparr; } };
补充说明
数组引用的写法规则是:对于类型为T[N]的数组,其引用格式为T (&变量名)[N]。这里的T是int*,所以对应的引用就是int* (&pparr)[2]。之前的写法错误地把指针和数组的层级搞反了,导致类型完全不匹配。
内容的提问来源于stack exchange,提问作者schanti schul
相关产品推荐
相关产品推荐

