为什么我在取消引用和不取消引用指针的情况下获得相同的值
Why do I get the same value with and without dereferencing a pointer
以下代码:
int number = 65;
char *ptr = reinterpret_cast< char* >(&number);
cout << *ptr << endl;
*ptr
打印A
,ptr
打印A
。为什么它们都打印相同的结果?
流正在重载<<
,因此无论如何都会为char
隐式完成取消引用。
更具体地说:由于char *
是 C 的string
,ostream
尝试这样读取它,即它取消引用指针并读取 char
s,直到找到一个零字节。(这仅适用于正确的字节序。
请考虑以下代码:
#include <iostream>
int main(void) {
char c = 'A';
int i = 66;
std::cout << c << 'n';
std::cout << &c << 'n';
std::cout << i << 'n';
std::cout << &i << 'n';
return 0;
}
在我的机器上(不是全部!(它打印
A
AB
66
0x7fff0d1db1bc
因为c
打印正确,但&c
被解释为字符串。但是c
不是以 null 结尾的,所以ostream
继续读取,找到 i
的第一个字节,然后找到一个空字节,因为 i
的值太小了,我们只使用它的四个字节中的一个。
但是,i
和&i
按预期打印。此行为仅适用于char
,因为它对其他类型的行为没有意义。
两者都打印相同的结果,因为:
- 除其他外,
ostream::operator<<
对char*
和char
都有过载(见这里和这里(。 char*
重载将参数解释为指向以 null 结尾的字节字符串的指针,而不是指向单个char
的指针。- 显然你的机器是小端序并且有
sizeof(char) < sizeof(int)
(与==相反(。这意味着number
占用的内存,当解释为char
s 的数组时,是一个值为 65 的char
,后跟一个或多个空char
s。因此,当number
被解释为以 null 结尾的字节字符串时,它包含值为 65 的单个字符。
因此,当您流式传输类型为 char
的 *ptr
时,char
重载会打印值为 65 的字符指向。当您流式传输类型 char*
的 ptr
时,char*
重载将打印指向的以 null 结尾的字节字符串,其中包含值为 65 的单个字符,因此再次打印单个字符。
关于第3点的进一步说明:
请注意,给定sizeof(char) < sizeof(int)
,您保证会得到一个以 null 结尾的字节字符串,其中只有一个字符CHAR_BIT
因为它至少为 8。 即值 65 不可能不适合单个char
。
也许你的机器有sizeof(char) == sizeof(int)
(在这种情况下,endianess无关紧要(,number
之后的内存是一个空字符,这只是巧合,再次构建一个看起来像以null结尾的字节字符串的东西。我说看起来像是因为只有当您被允许读取终止空字符时,它才真正是一个。由于在大多数系统上CHAR_BIT
是 8(POSIX 要求(,并且由于标准要求int
至少为 32 位,因此您的机器极不可能sizeof(char) == sizeof(int)
。
- C++取消引用指针.为什么会发生变化
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 取消引用运算符不能重载
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- C++ 关于指针取消引用的技术问题
- 没有取消引用/解包对象的标准方法?
- 列表 iter 不取消引用 使用列表进行插入排序
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 取消引用结束指针到数组类型的一个
- 取消引用向量时出现问题
- 取消引用指向整数的指针时获得不同的结果
- C++:取消引用十六进制值,有点语法问题
- C/C++ 取消引用错误:在空检查之前取消引用
- 取消引用后C++空测试
- 立即取消引用unique_ptr
- 如何在不使用临时变量的情况下取消引用返回指针的函数的返回值?
- 取消引用 void 指针以将值分配给结构
- boost_multi_index迭代器取消引用给出常量
- 矢量迭代器不能与 std::shared_ptr<> 取消引用
- C++我们可以取消引用此指针吗?如果是这样,那么如何,如果不是,那为什么?