我尝试获取类成员函数返回的指针的地址:
class Test{
...
char* d;
...
char* getData(){
return d;
}
...
}
现在我尝试获取d的地址(假设* d具有有效值):
Test t;
char** pd = &t.getData();
这会产生语法错误,无法在VC2010上编译。如何获取成员指针变量的地址?
答案 0 :(得分:2)
简短版本:您正试图获取右值的地址,这是非法的。
版本略长:当您执行t.getData()
时,*d
会按值返回。这很容易忘记,因为大多数时候,当你使用指针时,你不必担心按值传递而不是传递引用。你只需返回指针,因为它很小。
在这里,
char** pd = &t.getData();
t.getData的返回值是指针的副本,它是 rvalue ,这意味着它是临时的,并且在表达式结束后将不复存在。由于这个原因,你不能取rvalue的地址 - 一旦语句结束它就会失效。但是,如果你将该地址放在左值,它就可以正常工作:
Test t;
char* temp = t.getData();
char** pd = &temp;
那是因为现在temp是左值,你可以拿它的地址。
对于您尝试做的事情,您可能最好让getValue()
返回char**
。
答案 1 :(得分:0)
您的getData()
函数返回指针的副本。如果你想获取原始指针成员的地址,你必须改变它,以便它返回对指针的引用:
char *&getData() { return d; }
(从设计的角度来看,返回对内部指针的引用和获取地址是一个好主意是另一回事。)