指针参考

MEM*_*EMS 26 c++

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

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

什么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
}
Run Code Online (Sandbox Code Playgroud)

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

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

Vit*_*meo 28

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

插入const char* const& i回报:

声明我作为对const char的const指针的引用

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

  • @sagar:不,没有常量引用这样的东西.本质上,引用本身是不变的(不能重新定位),因此在它是一个庞大的之前添加"常量". (7认同)

Mar*_*ler 10

让我们把它分开:

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

  • const char 是指向的类型

  • * const 表示指针是常量

所以,这是对const char的const指针的引用.你不能改变char它所指向的(除非你抛弃它constness),你不能改变指针(即使它指向别的东西).指针通过引用传递,因此不会发生复制.


Kar*_*oll 8

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

考虑我们对参考文献的了解.C++中的引用是一个变量,它引用其他地方的现有变量:

int x = 1;
int &y = x;    // <-- y refers to x. Any changes to y will update x as well, and vice versa.
Run Code Online (Sandbox Code Playgroud)

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

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

所以在你的情况下你实际拥有的是对指针的引用!

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

在上面的示例中,更改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"
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我们传递myPtrChangePointer引用,以便它可以被函数修改.如果我们没有通过引用传递,则函数内部所做的任何更改都将丢失.

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

DoStuff(const Object &myObject);
Run Code Online (Sandbox Code Playgroud)

在你的情况下,你传递一个指针,而不是一个对象.

但是,通过引用传递const指针似乎有点多余.指针不能被改变(它是const),并且通过引用传递指针没有任何好处(通过引用传递对于像指针和整数这样的小对象的传递值并不是更有效).我不想猜测为什么它会在你的情况下完成.