0

C/C++ 允许返回指针:

int* returnpointer() {
    int c = 1;
    int *d = &c;
    return d;
}

以便它可以在调用者函数中使用:

int* p = returnpointer();

这是我最习惯的风格,因为它最自然。

那么,如果上述条件在正常情况下就足够了,为什么 C/C++ 会提供返回地址的语言功能呢?IE:

int& returnpointer() {
    int c = 1;
    int *d = &c;
    return *d;
}

通过调用者调用:

int* p = &returnpointer();

鉴于我更精通前者,后者是否有哪些功能是前者不太适合做的?

PS:我知道这样的代码很危险,因为它可能涉及指向在函数退出堆栈时不再存在的变量的指针。然而,这不是这个问题的范围。

4

3 回答 3

4

您将返回地址与返回引用混淆:

int& returnpointer() { ... }

在这里,returnpointer()返回对int. 引用是某种类型的对象的别名。引用对指针有不同的语义,因此它们往往服务于不同的目的。

一些非常重要的区别是引用不能被默认构造(没有什么要构造的),并且它们不能被重置。它们需要被初始化以引用现有对象,并且它们在其生命周期内引用同一个对象。

另一方面,指针保存值(表示地址),这些值可以在其生命周期内更改。可以使指针指向不同的对象,成为 anullptr或指向完全随机的某个位置(如果取消引用,可能会导致未定义的行为)。

请注意,您的两个示例都是错误的:第一个示例返回指向函数本地变量的指针。第二个做同样的事情,这次是参考。

于 2013-03-13T15:21:46.343 回答
0

int&不是操作符的地址。 int a = 0; int *ptr = &a; 那是地址运算符。

int& returnpointer() {
    int c = 1;
    int *d = &c;
    return *d;
}

这不会返回地址,而是int. 将引用视为另一个变量的别名。

int a = 15; int& ref = a;

ref现在只是a.

引用和指针之间的区别在于,引用永远不能为 NULL,它总是必须引用某些东西。

一点注意事项:

int* returnpointer() {
    int c = 1;
    int *d = &c;
    return d;
}

您在这里返回一个指向局部函数变量的指针c,这是未定义的行为,因为该变量在函数退出时被销毁。为了返回一个指针,您需要像这样在堆上创建它int * f = new int; *f = 5; return f;。现在您可以返回f并在函数外使用它。

于 2013-03-13T15:24:28.353 回答
0

C++ 允许返回指针和引用,因为它是完全合法的。

考虑一下这一点(我不提倡这一点,因为由于所有权问题,通常不鼓励返回在函数内分配的内存):

MyObject* create() {
    return new MyObject();
}; // eo create

一切都好。我们正在返回一个指针,并且我们动态分配了对象。逻辑上没有错(除了分配和返回一个没有所有权的指针......嘘!)。然而,一些函数将不得不这样做:

void* operator new(std::size_t size) {
    return malloc(size);
};

引用(您似乎有些困惑)也是完全可行的,即使在指针分配的东西上也是如此。如果我们有一个维护实例的管理器,它们可以非常简单地返回一个引用:

class Manager {
private:
    std::list<MyClass*> objects_;

public:
    Manager() {
    };
    ~Manager() {
        for(auto& o : objects_) {
            delete o;
        };
    };

    Myclass& create() {
        o = new MyClass();
        objects_.push_back(o);
        return *o;
    };
};

以上非常好,因为管理器管理对象的生命周期。

于 2013-03-13T15:26:55.167 回答