为什么"return 0"适用于在函数中返回指针,但不适用于参考?
why "return 0" works for returning a pointer in function, but not works for reference?
2月25日编辑:改变了我的问题,并为我的问题添加了一些描述。
=====================一些抱怨==
================================对于那些对我的问题投反对票的人:
这是我关于堆栈溢出的第一个问题。
- 关于这个问题:这个问题是从我的想法中浮现出来的。 就我而言,我认为
return 0
实际上为我的 程序,它绝对做到了。唯一可能误解的事情 人们可能是我提出了一个我认为它的工作原理的问题 方式,但它没有。 - 关于我的态度。也许你们是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 传递和返回。
- OpenGL - 在 NDC 中计算位置适用于着色器,但不适用于'regular'程序
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 如何修复我的最大公约数代码?它适用于除零和零以外的所有数字
- 选择排序C++(已修改)并非适用于所有情况
- 无法让"std::enable_if"适用于无作用域枚举
- 请找出我的代码中的错误,它在提交得到错误答案的同时仍然适用于我的所有测试用例
- 确定夏令时是否适用于特定日期
- 是否有一种 STL 算法可以最后找到,但它也适用于指针?
- 十进制到二进制的实现不能完全适用于我大学的检查器。问题或提示可能是什么
- 使用程序集嵌入数据时"Undefined reference"错误,使用适用于窗口的 mingw-w64 编译(COFF 而不是 ELF)
- 为什么 std::vector 适用于类定义中的不完整类型?
- 为什么哈希<常量字符*>适用于字符串而不是字符串变量?
- Lambda适用于最新的Visual Studio,但在其他地方不起作用
- 我该如何文档文档以使文档适用于类成员而不是匿名类型
- 计算 c# 中二进制文件符号的频率不起作用,但适用于等效的 c++ 代码
- 为什么 fstream.open(文件名) 适用于文字而不是生成的字符串?
- 模板重载和 SFINAE 仅适用于函数而不是类
- 为什么链接器不抱怨多个函数定义(仅适用于模板化函数)
- 我可以使用' == '来比较两个向量吗?我试过了,似乎工作正常。但我不知道它是否适用于更复杂的情况
- 延长临时的生命周期,适用于块范围的聚合,但不是通过"新";为什么?