我正在阅读关于为什么使用指针的讨论?并遇到了 Tooony(大多数投票)的回答,其中指出使用指针的一个原因是“当无法通过引用”将变量传递给函数时“。
当我们不能通过引用传递变量时,可能的情况是什么?
还有其他不能通过引用传递的情况吗?
请赐教,我想不出任何情况
谢谢
我正在阅读关于为什么使用指针的讨论?并遇到了 Tooony(大多数投票)的回答,其中指出使用指针的一个原因是“当无法通过引用”将变量传递给函数时“。
当我们不能通过引用传递变量时,可能的情况是什么?
还有其他不能通过引用传递的情况吗?
请赐教,我想不出任何情况
谢谢
你问,
“当我们不能通过引用传递变量时,可能的情况是什么?”
对于 C++11,有两种主要的此类情况(可能还有一些我没有想到的情况):
当函数声明也用于 C 语言绑定时。
当对象是一个未知边界的数组时。
在后一种情况下,可以想象,传递对数组第一项的引用,但是在函数内部,代码只需要获取地址即可返回数组,并且正式类型不仅仅是这种方式不切实际,而且极具误导性。
此外,令我惊讶的是,Visual C++ 11.0(Visual Studio 2012 附带的编译器)编译以下内容:
#include <iostream>
using namespace std;
void foo( int const (&a)[] )
{
for( auto p = &a[0]; *p != 0; ++p )
{
wcout << *p << endl;
}
}
extern int const data[];
int main( int argc )
{
foo( data );
}
int const data[] = {1, 2, 3, 4, 5, 0};
但是,MinGW g++ 4.7.1 拒绝它,因为它应该!
在 C++03 中确实存在但在 C++11 中不再存在的一种情况是,在 C++03 中,传递给引用的临时对象const
必须具有可访问的复制构造函数。那是因为在 C++03 中,编译器可以制作任意数量的副本。在 C++11 中,如果可能,必须直接绑定引用。
仔细检查是非情况的一种情况是,当您需要像空指针一样表达“不引用对象”的可能性时。
例如,
void foo( int const* pValue = 0 ) { if( pValue != 0 ) { ... } }
但是有一些解决方法,包括重载之一foo
:
void foo( int const& value ) { ... }
void foo() {}
引用必须指向已初始化的内存,也就是说,它们不允许是NULL
. 如果要允许在函数中不引用对象的参数,则必须使用指针。
但是,您似乎误读了所写的内容:
在 C 中,您不支持诸如字符串之类的复杂数据类型。也无法将变量“通过引用”传递给函数。
具体来说,在C中没有引用这样的概念。因此,您必须使用指针。然而,在 C++ 中,实际上没有任何地方不能使用引用,而您可以在函数参数列表中使用指针。