为什么"return 0"适用于在函数中返回指针,但不适用于参考?

why "return 0" works for returning a pointer in function, but not works for reference?

本文关键字:适用于 不适用 参考 指针 return 函数 为什么 返回      更新时间:2023-10-16

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];
}

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

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

没有与引用的"空指针"相对应的概念:引用始终绑定到对象或函数。对于指针,"null"值在某种程度上是一个可区分的值,表示"不是任何内容的地址"。相比之下,引用不允许不受任何约束。这就是为什么你的最后一个示例格式不正确的原因。

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

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

数组类型的令人困惑的是,数组不能按值传递给函数或从函数返回,但允许使用相应的语法 - 它是允许的,但意味着不同的东西f(arrT x)实际上意味着与f(int * x)在你的情况下相同。

用更专业的术语来说,数组只能作为 和 glvalues 传递和返回,而不能作为 prvalues 传递和返回。

相关文章: