将参数作为引用传递给具有(no) constness的指针会给出不同的地址
passing args as reference to pointer with(no) constness gives different addresses
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或其他东西?
pch2
是char*
,不是char const*
。您不能将char const*&
类型的引用绑定到char*
类型的指针,因此以下内容将是错误的:
char* p(0);
char const*& r(p);
同样,如果函数声明为void f(char const*& pch)
,则由于常量限定符不匹配,不能使用char*
参数调用它。
你的例子之所以有效,是因为const引用可以绑定到一个临时指针,编译器可以构造一个char*
指针的临时副本,给这个临时类型char const*
,并将引用pch
绑定到那个临时指针。
在第一种情况下,形参与函数的形参完全匹配,因此它可以直接绑定到引用。
在第二种情况下,类型是不同的(稍微不同),所以编译器创建一个临时传递给函数。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将参数作为引用传递给具有(no) constness的指针会给出不同的地址
- 向函数指针添加constness时会发生什么