| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2719 人关注过本帖
标题:结构体强制类型转换?
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
猜下面的代码输出什么?
程序代码:
#include <iostream>
#include <cstdlib>
#include <conio.h>

struct CustomData
{
    int x;
    char s[20];
};

int main(void)
{
    CustomData test = { 66 * 256 + 65, "Hello!" };
    CustomData* p = (CustomData*)&test.x;
    printf_s("%s\n", p);

    _getch();
    return EXIT_SUCCESS;
}


 

授人以渔,不授人以鱼。
2014-06-08 17:41
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
如果搞明白了11楼代码问什么有那样的输出,就能明白那种“强制类型转换”有什么用。

授人以渔,不授人以鱼。
2014-06-08 18:15
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
添加一段代码,看会不会更明白一些:
程序代码:
#include <iostream>
#include <cstdlib>
#include <conio.h>

struct CustomData
{
    int x;
    char s[20];
};

int main(void)
{
    CustomData test = { 66 * 256 + 65, "Hello!" };
    printf_s("%d\n%s\n%s\n", (CustomData*)test.x, (CustomData*)&test.x, (CustomData*)test.s);

    unsigned char* p = (unsigned char*)&test.x;
    for (size_t index = 0; index < sizeof(test.x); ++index)
    {
        printf_s("%02x", *(p + index));
    }
    putchar('\n');

    _getch();
    return EXIT_SUCCESS;
}




[ 本帖最后由 TonyDeng 于 2014-6-8 19:02 编辑 ]

授人以渔,不授人以鱼。
2014-06-08 18:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
printf_s("%d\n%s\n%s\n", (CustomData*)test.x, (CustomData*)&test.x, (CustomData*)test.s);

授人以渔,不授人以鱼。
2014-06-08 19:04
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
#include <iostream>
#include <cstdlib>
#include <conio.h>
struct CustomData
{
    int x;
    char s[20];
};
int main(void)
{
    CustomData test = { 66 * 256 + 65, "Hello!" };     八进制的运算 将66放在10位 65放各位  66 65对应什么字符我就不 知道了
                                                        
    CustomData* p = (CustomData*)&test.x;             这句写成   char *p=(char*)&test.x  就完事了 何必呢 何苦那么牵强呢,不就是给个地址赋类型属   性嘛  在汇编层面没有这个类型的概念 不就是地址+1 或者+2 或者+4 或者+。。。。。。。。。。。。。。。嘛
    printf_s("%s\n", p);                              输出为 65对应字符66对应字符Hello!  不会是SBHello!吧  真是 你就邪恶了
    _getch();
    return EXIT_SUCCESS;
}

[ 本帖最后由 zhu224039 于 2014-6-8 19:19 编辑 ]

我要成为嘿嘿的黑客,替天行道
2014-06-08 19:16
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你执行了看呗。不是什么牵强和完事,而是为了说明对printf()函数来说,所有数据类型转换都是废的,控制数据输出的部位在那个格式字符串中!

授人以渔,不授人以鱼。
2014-06-08 19:22
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
回复 16 楼 TonyDeng
我态度有点不好了,估计是天气热了
是的,我完全领悟错意思了。
以后会注意措辞的


[ 本帖最后由 zhu224039 于 2014-6-8 19:26 编辑 ]

我要成为嘿嘿的黑客,替天行道
2014-06-08 19:24
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
程序代码:
unsigned char* p = (unsigned char*)&test.x;
    for (size_t index = 0; index < sizeof(test.x); ++index)
    {
        printf_s("%02x", *(p + index));
    }
    putchar('\n');

这段,是查看整数test.x内存镜像的代码,如果愿意,也可以用它查看结构体的内存镜像。

授人以渔,不授人以鱼。
2014-06-08 19:34
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
回复 18 楼 TonyDeng
是的,printf是个很有价值的函数
有点我还是得说,格式 要与打印变量的类型对应,C语言是强类型的语言


[ 本帖最后由 zhu224039 于 2014-6-8 19:42 编辑 ]

我要成为嘿嘿的黑客,替天行道
2014-06-08 19:41
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
那个整数test.x其实就是字符串,学C的怎么会不明白?早就接触过的东西,没深入思考而已,任谁都知道printf("%d", 65)是输出数值,但printf("%c", 65)却输出字符,同样的数据(都是65,连转换都没有,看看14楼专门摘出来那一行代码),输出不同,问题难道在数据上?怎么现在到了这个问题就不知道怎么回事?

[ 本帖最后由 TonyDeng 于 2014-6-8 20:06 编辑 ]

授人以渔,不授人以鱼。
2014-06-08 20:04
快速回复:结构体强制类型转换?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.057387 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved