将参数作为引用传递给具有(no) constness的指针会给出不同的地址

passing args as reference to pointer with(no) constness gives different addresses

本文关键字:constness 指针 地址 no 参数 引用      更新时间:2023-10-16
void f(char  *  & pch) {
    cout << &pch << " " << pch << endl;
}
int main() {
    char *pch2 = new char[11];
    strcpy(pch2, "1234567890");
    cout << &pch2 << " " << pch2 << endl;
    f(pch2);
    return 0;
}

给出下一个输出:

0xbfa0d62c 1234567890 
0xbfa0d62c 1234567890

但是如果我像这样修改第一行

void f(char const * const & pch) {

我将得到:

0xbfec7df8 1234567890
0xbfec7dfc 1234567890

是指针出现的差异,因为需要将新的内存单元标记为const或其他东西?

pch2char*,不是char const*。您不能将char const*&类型的引用绑定到char*类型的指针,因此以下内容将是错误的:

char* p(0);
char const*& r(p);

同样,如果函数声明为void f(char const*& pch),则由于常量限定符不匹配,不能使用char*参数调用它。

你的例子之所以有效,是因为const引用可以绑定到一个临时指针,编译器可以构造一个char*指针的临时副本,给这个临时类型char const*,并将引用pch绑定到那个临时指针。

在第一种情况下,形参与函数的形参完全匹配,因此它可以直接绑定到引用。

在第二种情况下,类型是不同的(稍微不同),所以编译器创建一个临时传递给函数。