【问题标题】:Address of pointer returned by function函数返回的指针地址
【发布时间】:2012-08-24 03:19:07
【问题描述】:

我尝试获取类成员函数返回的指针的地址:

class Test{
    ...
    char* d;
    ...
    char* getData(){
        return d;
    }
    ...
}

现在我尝试获取 d 的地址(假设 *d 具有有效值):

Test t; 
char** pd = &t.getData();

这会产生语法错误,并且无法在 VC2010 上编译。如何获取成员指针变量的地址?

【问题讨论】:

  • 你不能-> char** getData(){ return &d; } , char** pd = t.getData();
  • 你能把你遇到的语法错误贴出来吗?

标签: c++ class pointers reference member


【解决方案1】:

短版:你试图获取一个右值的地址,这是非法的。

稍长的版本:当您执行t.getData() 时,*d 按值返回。这很容易忘记,因为大多数时候,当您使用指针时,您不必担心按值传递与按引用传递。您只需返回指针,因为它很小。

这里,

char** pd = &t.getData();

t.getData 的返回值是指针的副本,它是一个右值,意味着它是临时的,在表达式结束后将不复存在。出于这个原因,您不能获取右值的地址——一旦语句结束,它就会失效。但是,如果您将该地址放在左值中,它就可以正常工作:

Test t;
char* temp = t.getData(); 
char** pd = &temp;

这是因为现在 temp 是一个左值,你可以获取它的地址。

不过,对于您想要做的事情,您最好让getValue() 返回char**

【讨论】:

  • +1。你说的是真的,而且解释得很好。但值得一提的是,在第二个版本的末尾,pd 拥有temp 的地址,而不是原始成员t.d 的地址。
【解决方案2】:

您的getData() 函数返回指针的副本。如果要获取原始指针成员的地址,则必须对其进行更改,使其返回对指针的引用:

char *&getData() { return d; }

(从设计的角度来看,返回对内部指针的引用并获取它们的地址是否是一个好主意是另一回事。)

【讨论】:

    猜你喜欢
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 2011-11-04
    • 1970-01-01
    • 2014-03-30
    • 2016-03-16
    • 1970-01-01
    相关资源
    最近更新 更多