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或其他东西,是否出现指针差异?
答案 0 :(得分:5)
pch2
是char*
,而不是char const*
。您不能将char const*&
类型的引用绑定到类型char*
的指针,因此以下内容将是格式错误的:
char* p(0);
char const*& r(p);
同样,如果您的函数声明为void f(char const*& pch)
,由于const限定符不匹配,您将无法使用char*
参数调用它。
你的例子工作的原因是const引用可以绑定到临时,并且编译器可以构造你的char*
指针的临时副本,给临时类型char const*
,并绑定对该临时指针的引用pch
。
答案 1 :(得分:2)
在第一种情况下,参数与函数的参数完全匹配,因此可以直接绑定到参考。
在第二种情况下,类型是不同的(稍微),因此编译器会创建一个传递给函数的临时类型。