指向引用的指针

Pointer to reference

本文关键字:指针 引用      更新时间:2023-10-16

我正在阅读,我看到了以下代码:

template <>
inline bool is_empty(const char* const& x)
{
return x==0 || *x==0;
}

const char* const& x是什么意思?

我尝试了以下代码来理解它:

void f(const char* const& x) 
{
// whatever
}
void main()
{
char a = 'z';
char &j = a;
f(a);//error
f(*a);//error
f(&a);//fine
f(j);//error
f(&j);//fine     
f('z');//error
}

它仅适用于f(&a)f(&j)

const char* const& x实际上是什么意思?

cdecl是一个有用的在线工具,可以帮助初学者习惯复杂的声明。

插入const char* const& i返回:

声明i为指向const char 的const指针的引用

声明的含义现在应该很明显了。

指针引用就是指针引用。

考虑一下我们对参考文献的了解。C++中的引用是指其他地方现有变量的变量:

int x = 1;
int &y = x;    // <-- y refers to x. Any changes to y will update x as well, and vice versa.

还要考虑一下我们对指针的了解。指针指向内存中的另一个对象:

int *m = new int(5);   // Pointer to an allocated integer in memory.
int *n = m;            // Pointer to the same memory.

因此,在您的情况下,您实际拥有的是对指针的引用!

int *m = new int(5);   // Pointer to an allocated integer in memory.
int *ptr = m;          // Pointer to m.
int *&ptrRef = ptr;    // Reference to ptr.

在上面的示例中,更改ptrRef将更新指针,但不会更新值。

下面是一个完整的例子:

int *myPtr = new int(5);   // myPtr points to an integer.
...
void ChangePointer(int *&ptr)
{
delete ptr;
ptr = new int(6);
}
...
std::cout << *myPtr << std::endl;  // <-- Output "5"
ChangePointer(myPtr);
std::cout << *myPtr << std::endl;  // <-- Output "6"

在上面的例子中,我们通过引用将myPtr传递给ChangePointer,以便函数可以对其进行修改。如果我们不通过引用传递,那么函数内部所做的任何更改都将丢失。

在您的情况下,您正在传递对const指针的引用。这大致相当于:

DoStuff(const Object &myObject);

在您的情况下,您传递的是指针,而不是对象。

不过,通过引用传递const指针似乎有点多余。指针不能更改(它是常量),并且通过引用传递指针没有任何好处(对于指针和整数等小对象,通过引用传递并不比通过值传递更有效)。我不想猜测为什么在你的情况下这样做。

让我们分开来看:

  • 尾随的&意味着这是对任何类型的引用

  • const char是指向的类型

  • * const表示指针为常数

因此,这是对const字符的const指针的引用。您不能更改它所指向的char(除非丢弃constness),也不能更改指针(即使其指向其他对象)。指针是通过引用传递的,因此不会发生复制。

其他答案主要涉及指针引用的语义。

但如果您有疑问:它是对指针的引用,还是指向引用?这可能令人困惑!但是,C++不允许指针指向引用

指针存储对象的地址,引用是而不是对象,因此不能有任何指向引用的指针。

它应该转换为"对常量指针的引用,指向常量字符"。这意味着被引用的指针不能被分配一个新的目标地址(指向),并且它引用的字符串不能被修改。

评论后编辑。不过,后果应该保持不变。