首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >指针引用和取消引用

指针引用和取消引用
EN

Stack Overflow用户
提问于 2014-05-27 08:44:24
回答 3查看 160关注 0票数 2

我有以下代码:

代码语言:javascript
运行
复制
#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?我认为应该是:

代码语言:javascript
运行
复制
int('d') << 24; //plus some trash on stack after ch

问题是为什么标准输出的第二行和第三行是不同的?

6295640 6295641 6295642 6295643 1684234849 6579042 25699 100 1633837924 6447972 25444 100

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-27 09:22:11

那么,您正在调用未定义的行为,您期望的是一个正常的答案吗?)

第二行调用未定义的行为:

代码语言:javascript
运行
复制
std::cout << *(int*)(ch+0)

没关系,因为在sizeof(int)上确实存在值为ch+0字节的数据,但是:

代码语言:javascript
运行
复制
*(int*)(ch+2)

代码语言:javascript
运行
复制
*(int*)(ch+3)

每当sizeof(int) 4字节或更多(大多数编译器/平台使用4个字节)时,都需要读取数组的末尾。

那么,为什么在数组之后期望垃圾呢?为什么有一个值为0的字节是不可接受的?

它是未定义的行为,因此,从定义上说,任何事情都是可以接受的。包括0。

因此,您将( 100,0,0,0)读取为整数,显示为100。

为什么你问的是100而不是100 << 24?

这是http://en.wikipedia.org/wiki/Endianness的事。如果您的平台是小终端,那么( 100,0,0,0)将被解释为100,如果它是大端,则(100,0,0,0)被解释为100 << 24。

你似乎是在一个小小的终端平台上:所有的x86和x86_64 CPU,比如英特尔/AMD,都是小终端。

注意:在std::cout << (long)(int*)(ch+0)中,转换为long是不必要的,ostream可以显示void const*,并且有从T*void*的隐式转换,这样就可以不使用long__获得地址。

票数 0
EN

Stack Overflow用户

发布于 2014-05-27 08:47:21

int('d')是转换为int的字符'd',其十进制值为100。你可以看看ASCII表

此外,您还使用了指针算法,这是不正确的,因为每次读取ch + x时,x > 0都会在数组结束后读取。

那么为什么第二行的最后一个数是100呢?应该是100 << 24外加一些垃圾

你可能会阅读100,0,0,0,0(虽然任何垃圾在1,2,3位都是可能的),并且由于环境的原因,它被读为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的普通字符文本具有char类型,其值等于执行字符集中c-char编码的数值。包含多个c-char的普通字符文字是多字符文字。多字符文字具有int类型和实现定义的值.(.)

票数 2
EN

Stack Overflow用户

发布于 2014-05-27 09:17:49

代码不是无警告的。

代码语言:javascript
运行
复制
warning: multi-character character constant [-Wmultichar]

产出如下:

代码语言:javascript
运行
复制
6296232 6296233 6296234 6296235
1684234849 6579042 25699 100
1633837924 6447972 25444 100

说明:对于第一行,假定指针ch有值6296232,它具有chch+1ch+2ch+3打印的指针值。

对于第2行,假设32位机器上的一个int是4个字节,

代码语言:javascript
运行
复制
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)

对于第3行,假设32位机器上的一个int是4个字节,

代码语言:javascript
运行
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23884829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档