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