指针参考

时间:2016-06-09 09:48:19

标签: c++

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

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实际意味着什么?

5 个答案:

答案 0 :(得分:29)

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

插入const char* const& i会返回:

  

声明我作为对const char

的const指针的引用

声明的含义现在应该是显而易见的。

答案 1 :(得分:10)

让我们把它分开:

  • 尾随&表示这是引用到任何类型。

  • const char是指向

  • 的类型
  • * const表示指针是常量

因此,这是对const char的const指针的引用。您无法更改它指向的char(除非您丢弃constness),并且您无法更改指针(即使其指向其他内容)。指针通过引用传递,因此不会发生复制。

答案 2 :(得分:8)

指针引用正如它所说的那样,是对指针的引用。

考虑我们对参考文献的了解。 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),并且通过引用传递指针没有任何好处(通过引用传递对于像指针和整数这样的小对象的传递值并不是更有效)。我不想猜测为什么会这样做。

答案 3 :(得分:1)

其他答案主要涵盖了对指针的引用的语义。

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

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

答案 4 :(得分:0)

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

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