【问题标题】:why "return 0" works for returning a pointer in function, but not works for reference?为什么“return 0”适用于返回函数中的指针,但不适用于参考?
【发布时间】:2017-07-15 23:03:00
【问题描述】:

2 月 25 日编辑:更改了我的问题,并为我的问题添加了一些描述。

=======================有人抱怨======================= ====

致那些对我的问题投反对票的人:

这是我关于堆栈溢出的第一个问题。

  1. 关于这个问题:这个问题是从我的想法中浮现出来的。就我而言,我认为return 0 实际上为我做了一些事情 程序,它确实做到了。唯一会误会的 人们可能是我提出了一个问题,我认为它是这样工作的 但它没有。
  2. 关于我的态度。也许你们这里的人是 C++ 专家,你可能认为我的问题很愚蠢。然而,作为一个非英语母语的人,这个问题花了我 4 个小时思考和做测试,2 个小时在谷歌上搜索,但也花了我至少半个小时来发布。作为一个自学成才的新手,我已经尽我最大的努力提出这个问题。

因此,请至少发表评论,让我知道当您投反对票时,我可以改进我提交问题的方式。不要只是简单的点击。你的点击就像是一个让我思考的新问题:“我做错了吗?” “我怎么解决?”这将迫使我重新考虑我所做的事情;但就像普通问题一样,如果有人可以提供一些提示会有所帮助。

作为一个新手,我不会停下来提出问题;所以我认为指出我的问题会帮助我提高我提出高质量问题的能力,你也会受益,因为你将来可能会看到一些好的问题。

最后,再次感谢这个地方;我从这里得到了很多答案;也感谢那些帮助我解决问题的人。

========================问题行======================

这个函数我打算通过使用“使用别名形式”来获取一个数组参数,并尝试将数组本身返回给调用函数。我尝试对这个函数使用指针和引用。

这是我从 C++ 入门中学到的:

using arrT = int[10];
arrT* func(int i);

此代码假设定义了一个函数,该函数将返回一个指针,该指针指向一个包含十个整数的数组;我明白这一点,但我没有从书中得到一个例子。

这是我的尝试:

使用指针,试图直接返回指针,但是出错了。

arrT* return_p(arrT arr){
    for(int i = 0; i < 10; ++i){
        *(arr+i) *= 2;
    }
    return arr;//error, can't convert int* to int (*)[10]
}

我知道因为这里arr 被转换并丢失了数组的维度。但是,我刚刚找到了一种适合我的方法:

arrT* return_p(arrT arr){
    for(int i = 0; i < 10; ++i){
        *(arr+i) *= 2;
    }
    return 0; // return 0 is return pointer arr that point the first element of array arr.
}

我只是想知道return 0 是如何在这里工作的?如果我使用引用而不是使用指针,我确实有另一个结果:

arrT& return_r(arrT &arr){
    for(auto &i : arr){
        i *= 2;
    }
    return arr; // works, returned the reference to array named arr
}

return 0 不适用于参考版本。

 arrT& return_r(arrT &arr){
    for(auto &i : arr){
        i *= 2;
    }
    return 0; // error, using an int rvalue to initialize a non_const that has type int(&)[10];
}

我希望我清楚地说明了我的问题。感谢您的帮助!

【问题讨论】:

  • return 0 只返回0,没有什么特殊含义,也没有什么神奇的作用。
  • 你试过 return_p(arrT *arr) 吗?
  • 是的,该表单不起作用。
  • return arr; -> return (arrT *)arr; 在第一个例子中

标签: c++ arrays c++11 pointers reference


【解决方案1】:

文字0是一个“空指针常量”,它可以用来初始化任何指针类型(对象指针、函数指针、成员指针或空指针)的值。此初始化的结果是该类型的空指针值。

没有对应于引用的“空指针”的概念:引用总是绑定到对象或函数。对于指针,“null”值在某种程度上是一个可区分的值,表示“不是任何东西的地址”。相比之下,引用不允许不受任何约束。这就是为什么您的最后一个示例格式错误的原因。

顺便说一句,如果您将数组作为引用传递,您可以返回数组的地址:

arrT * f(arrT & a) { return &a; }

数组类型令人困惑的是,数组不能按值传递给函数或从函数返回,但允许相应的语法——允许,但含义不同 em>:f(arrT x) 在您的情况下实际上与 f(int * x) 的含义相同。

在更专业的术语中,数组只能作为和 glvalues 传递和返回,但不能作为 prvalues。

【讨论】:

  • 非常感谢您的解释。根据您的回答,我认为在我的程序return 0 中只是返回了一个nullptr 指针,而这个指针可以代表任何类型的指针,所以编译器认为它是合法的。不确定我的猜测是否正确:)
  • @GuYu:嗯,是的,基本上。更准确地说,每个指针类型都有一个空指针值,并且您正在返回您的类型的特定空指针 (arrT *)。
  • 作为附录,C 宏 NULL 通常是 #defined 为 0,或者如果编译器特别花哨,(void *) 0。在 C++ 中,NULL 是整数文字 0(或者,在 C++11 之前,一个常量表达式计算为 0,例如文字 0 或表达式 1 - 1);从 C++11 开始,它可能是 std::nullptr_t 类型的值(通常是 nullptr)。
  • @JustinTime:C++ 不要求将NULL 扩展为0。而且,花哨的不是编译器,而是库。
猜你喜欢
  • 2021-08-17
  • 1970-01-01
  • 2014-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
  • 2012-06-29
相关资源
最近更新 更多