指针引用和解引用
Pointer reference and dereference
我有以下代码:
#include <iostream>
char ch[] = "abcd";
int main() {
std::cout << (long)(int*)(ch+0) << ' '
<< (long)(int*)(ch+1) << ' '
<< (long)(int*)(ch+2) << ' '
<< (long)(int*)(ch+3) << std::endl;
std::cout << *(int*)(ch+0) << ' '
<< *(int*)(ch+1) << ' '
<< *(int*)(ch+2) << ' '
<< *(int*)(ch+3) << std::endl;
std::cout << int('abcd') << ' '
<< int('bcd') << ' '
<< int('cd') << ' '
<< int('d') << std::endl;
}
我的问题是为什么"d"的指针是100 ?我认为应该是:
int('d') << 24; //plus some trash on stack after ch
问题是为什么标准输出的第二行和第三行是不同的?
6295640 6295641 6295642 6295643
1684234849 6579042 25699 100
1633837924 6447972 25444 100
谢谢。
int('d')
为字符'd'
转换成int型,其十进制值为100。你可以看一下ASCII表
除此之外,你使用的指针算术是不正确的,因为每次读取ch + x
时,x > 0
将读取超过数组的末尾。
那么为什么第二行的最后一个数字是100呢?应该是100 <<24加一些垃圾
可能你读到100,0,0,0(尽管任何垃圾都可能在第一,第二,第三位),它被读为100,因为端烷。同样的,为什么"第三项是:(int)('d'*256 + 'c') = 25699
而不是'c'*256 + 'd'
.
(…)包含单个c字符的普通字符具有类型char,其值等于编码的数值执行字符集中的c字符。一个普通的人物包含多个c字符的文字是多字符文字。多字符文字类型为int和实现定义的价值。(…)
好吧,你正在调用未定义行为,你期望得到一个理智的答案是什么?;)
第二行调用未定义行为:
std::cout << *(int*)(ch+0)
是可以的,因为在ch+0
处确实有sizeof(int)
字节的数据,但是:
*(int*)(ch+2)
和
*(int*)(ch+3)
涉及在sizeof(int)
大于等于4字节时(大多数编译器/平台使用4字节)读取数组的末尾。
0
的字节?
这是未定义的行为,因此根据定义,任何东西都是可以接受的。包括0。
因此你读到的(100,0,0,0)是一个整数,显示为100。
为什么是100而不是100 <<你问?
嗯,这是顺序的问题。如果您的平台是小端序,那么(100,0,0,0)将被解释为100,如果它是大端序,那么(100,0,0,0)将被解释为100 <<24 .
你似乎是在一个小端平台上:所有的x86和x86_64 cpu,如Intel/AMD都是小端。
注意:在std::cout << (long)(int*)(ch+0)
中,转换为long
是不必要的,ostream
可以显示void const*
,并且从T*
到void*
有一个隐式转换,因此您将获得没有long
的地址。
代码不是无警告的
warning: multi-character character constant [-Wmultichar]
输出是:
6296232 6296233 6296234 6296235
1684234849 6579042 25699 100
1633837924 6447972 25444 100
解释:对于第一行,假设指针ch
的值为6296232
,那么它将显示ch
, ch+1
, ch+2
, ch+3
的指针值
表示第二行,假设一个int
在32位机器上是4字节,
1st entry is : (int)('d'*256*256*256 + 'c'*256*256 + 'b'*256 + 'a') = 1684234849
2nd entry is : (int)('d'*256*256 + 'c'*256 + 'b') = 6579042
3rd entry is : (int)('d'*256 + 'c') = 25699
4th entry is : (int)('d') = 100 (ASCII value of 'd)
表示第三行,假设一个int
在32位机器上是4字节,
1st entry is : (int)('d' + 'c'*256 + 'b'*256*256 + 'a'*256*256*256) = 1633837924
2nd entry is : (int)('d' + 'c'*256 + 'b'*256*256) = 6447972
3rd entry is : (int)('d' + 'c'*256) = 25444
4th entry is : (int)('d') = 100 (ASCII value of 'd)
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 将代码声明放入字中(引用操作符和解引用操作符混淆)
- 指向根的二叉树指针需要被引用和解引用.为什么
- 指针引用和解引用
- c++中指针的递增和解引用顺序
- 理解引用和解引用操作符
- 使用指针和解引用指针按引用传递
- 直接访问变量(而不是使用指针和解引用)会得到不同的值吗?
- 将映射结构强制转换为void指针和解引用
- c++的引用和解引用
- 同一指令中的引用和解引用