指针引用和解引用

Pointer reference and dereference

本文关键字:引用 和解 指针      更新时间:2023-10-16

我有以下代码:

#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' .

如果有人感兴趣,为什么(int)(ch+2) = (int)('d'*256 + 'c') = 25699 c++标准n3337 § 2.14.3/1

(…)包含单个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)