| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2719 人关注过本帖
标题:结构体强制类型转换?
只看楼主 加入收藏
miku
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2014-6-7
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:31 
结构体强制类型转换?
p=(struct student *)stu[0].name
printf("%s",p)
输出的是stu[0]中成员name的值
但我觉得应该是如果要输出的是stu[0]中成员name的值应该是print("%s",*p)   p是个地址阿,print("%s",p)输出应该是个地址嘛
搜索更多相关主题的帖子: 结构体 
2014-06-07 16:23
张小齊
Rank: 2
等 级:论坛游民
帖 子:14
专家分:46
注 册:2014-5-23
收藏
得分:0 
我觉得你还是先仔细看看书吧!
2014-06-07 17:37
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
这个问题集中反映了很多典型的误区,值得讨论。

授人以渔,不授人以鱼。
2014-06-07 19:03
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:5 
“%s”限制了输出语句从p提供的地址值处开始读,在读到字符串结束标志'\0'之前,所有内容都当做是字符串的内容进行输出。

所以我揣测你的student类型的第一个值便是字符串类型的name,

所以输出stu[0]的name部分。

学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2014-06-07 21:26
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
排错掉信息恰好相同偶然的情况

根据你所叙述的输出结果,基本可以做上面的揣测。

你可以把第一句改一下,不要将p定位到结构体的第一个成员的地方,定位到一个比如说,double类型的成员的地址处试试

看看输出的是不是乱码。

学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2014-06-07 21:42
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:2 

p=(struct student *)stu[0].name
1. .的运算优先级大于强制类型转换    所以(struct student *)stu[0].name 这句的意思为 将数据结构stu的name指针强制转换成(struct student *)类型指针后给p
p是一个指向struct student类型的指针
2. name是一个字符数组 它本身就是一个指针值 数据结构的起始地址是和他第一个元素所在地址是相同的  所以就是在值上 stu[0]=name 语义上是不能等同的 上面语句完全可以写成 p=stu
   何必呢 何苦呢,有意思吗?没意思
3.printf %s格式 是打印从指定地址开始以0结束的这么一个区间的数据  楼主对printf用法不熟
4.真的不明白这个语句有意思吗? 无聊透顶

[ 本帖最后由 zhu224039 于 2014-6-7 22:11 编辑 ]

我要成为嘿嘿的黑客,替天行道
2014-06-07 22:01
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
p=(struct student *)100   楼主你能接受吗?

struct student* p
p=100 为什么不对 能说下吗?///

我要成为嘿嘿的黑客,替天行道
2014-06-07 22:08
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:3 
随手写了一段,楼主可以随便看看

#include<stdio.h>
struct student
{
    char name[20];
    double grade;
    int age;
};

int main()
{
    struct student stu[3];
    struct student *p=(struct student *)&stu[0].grade;

    //stu[0].name="babyBoy";
    scanf("%s,%d,%d",&stu[0].name,&stu[0].grade,&stu[0].age);
    fflush(stdin);
    printf("%s\n",stu[0].name);
    scanf("%s,%d,%d,%s,%d,%d",&stu[1].name,&stu[1].grade,&stu[1].age);
    fflush(stdin);
    printf("%s\n",stu[1].name);
    scanf("%s,%d,%d,%s,%d,%d",&stu[2].name,&stu[2].grade,&stu[2].age);
    fflush(stdin);
    printf("%s\n",stu[2].name);

    printf("\n%s\n%s\n",stu[0].name,p);
    //上面这句p输出的前面部分是乱码,直到遇到stu的第二个元素的第一个name成员的\0时候才结束输出

    return 0;
}



运行结果:

name1,1.1,1
name2,2.1,2
name3,3.1,3
name1,1.1,1
烫烫烫烫烫烫烫烫name2,2.1,2
请按任意键继续. . .

学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2014-06-07 23:28
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
运行结果如下(上面稍有偏差,因为代码后来做了稍微的改动,本质上不影响理解,但还是准确一点吧):

name1,1.1,1
name1,1.1,1
name2,2.2,2
name2,2.2,2
name3,3.3,3
name3,3.3,3

name1,1.1,1
烫烫烫烫烫烫烫烫name2,2.2,2
请按任意键继续. . .

学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2014-06-08 00:07
loveClangage
Rank: 8Rank: 8
来 自:广东云浮
等 级:蝙蝠侠
帖 子:326
专家分:891
注 册:2013-8-23
收藏
得分:0 
路过

编写的程序,不能改变世界,却可以改变自己...
2014-06-08 12:08
快速回复:结构体强制类型转换?
数据加载中...
 
   



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

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