哪位高手帮我解释一下 ?

2024-12-12 16:34:48
推荐回答(1个)
回答1:

第一句int & *pnum=num;
这句声明是错误的。看声明语句的方法就是从变量名从里往外看,所以pnum是个指针,该指针指向一个int类型的引用,这是非法的。在C++中,引用不能作为数组元素和指针指向的元素。例如,下面的声明是非法的:
int &a[5]; //error 数组的元素是引用
int &*p; //error p指向一个引用
但是下面的声明合法:
int b[5];
int (&a)[5] = b; //OK 这里a是一个数组的引用;而不是“数组的元素是引用”

不过若是只写int (&a)[5];而不初始化也是错误的,因为引用必须显式初始化。

第二句int * &refpnum=pnum;是正确的(前提是pnum是int*类型),这里refpnum是个引用,该引用所引的是int*类型的变量。

至于引用指针的实践作用,我举一个最简单的例子:
假设getPointer函数需要返回主调函数一个地址,该地址存储的是一个int类型的数据,那么我们肯定设计成返回int*变量,但是该函数又要返回另一个值来表示操作是否成功,可以返回bool类型的变量。可是一个函数无法同时返回两个数据,在C语言中,会把函数设计成如下:
typedef int bool;
bool getPointer(int **p);
这样在主函数中这样用:
int *p = NULL;
bool bOk = getPointer( &p);
然后p中就存储了getPointer写入的地址值了,而fOk记录了函数是否运行成功。
在C++中,同样功能的函数可以这样设计:
bool getPointer(int *&p);
主函数中:
int *p = NULL;
bool Fok = getPointer(p);
这和上面的代码完成同样的事情。

为方便你,我给你个完整的程序,你可以研究下:
#include
using namespace std;

int globalVar = 24; //24随便想出的,没有实际意义

//你的编译器可能不支持bool和true关键字,你可以用int和1代替
bool getPointer(int *&ref) {
ref = &globalVar;
return true;
}

int main() {
int *p = NULL;
if(!getPointer(p)) {
//返回了false,这个简单的程序不会返回false
cout << "error" << endl;
} else {
//返回了true,成功。进行输出
cout << *p << endl;
}
return(0);
}