标题:结构体指针这块,这个转换不太明白
只看楼主
msl12
Rank: 1
等 级:新手上路
帖 子:152
专家分:0
注 册:2015-2-6
结帖率:25%
 问题点数:0 回复次数:9 
结构体指针这块,这个转换不太明白
# include <stdio.h>

struct Student
{
    int num;
    char name[20];
}leader[2]={10010, "Cool", 10086, "Good"};

int main(void)
{
    Student * p;
    p=(Student *)leader[1].name;//此处强制类型转换,编译没有出错,可是它真的把leader[1].name转换成了Student *类型了么,怎么做到的。。。
    printf("%s\n", leader[1].name);

    return 0;
}
搜索更多相关主题的帖子: include return leader 结构体 10086 
2015-03-21 21:48
uswood
Rank: 2
等 级:论坛游民
帖 子:34
专家分:16
注 册:2014-3-29
得分:0 
好像声明应该是
struct student *p
然后后面那个括号没看懂 但这个写法也许是想说的是p这个指针指向leader[1].name这个值的地址吧 p是指针 可以储存地址  所以应该不存在转换的问题
 刚学 仅供参考。。
2015-03-21 22:00
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
回复 2楼 uswood
我以前就説過,“强制轉換”實際上並不轉換數據。

授人以渔,不授人以鱼。
2015-03-21 22:27
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
像一樓代碼那樣的寫法,其實是錯得很離譜的寫法。强制編譯器無語法錯誤地通過編譯,不等於程序可以正確運行,除非搞破壞正是你想要的。的確有的半老不新的程序員,懂一點内幕,就專門玩這種手段,以爲能編譯器所不能,諸如忽略警告、强行消除錯誤信息這類半吊子建議,即是此類。

授人以渔,不授人以鱼。
2015-03-21 22:33
uswood
Rank: 2
等 级:论坛游民
帖 子:34
专家分:16
注 册:2014-3-29
得分:0 
回复 3楼 TonyDeng
这么一提终于明白楼主说的转换是说啥了
2015-03-23 18:16
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
以下是引用uswood在2015-3-23 18:16:00的发言:

这么一提终于明白楼主说的转换是说啥了

我不會無的放矢的。

授人以渔,不授人以鱼。
2015-03-23 18:23
峰哥不是
Rank: 2
等 级:论坛游民
威 望:1
帖 子:28
专家分:75
注 册:2013-11-19
得分:0 
回复 6楼 TonyDeng
版主的繁体字是怎么做到的?

纸上得来终觉浅,绝知此事要躬行
2015-03-23 22:19
msl12
Rank: 1
等 级:新手上路
帖 子:152
专家分:0
注 册:2015-2-6
得分:0 
回复 3楼 TonyDeng
“‘强制轉換’實際上並不轉換數據”。怎么理解呢?比如说:
int *p;
p=(int *)malloc(sizeof(int));
2015-04-06 16:24
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
以下是引用msl12在2015-4-6 16:24:55的发言:

“‘强制轉換’實際上並不轉換數據”。怎么理解呢?比如说:
int *p;
p=(int *)malloc(sizeof(int));

malloc()分配的內存空间,初始是没有确定数据类型的,它的返回指针是void*,而声明的p指针是意图指向int类型的,这个时候,就把void*指针视为int*指针,才能使等号两边的类型一致,符合语法要求。

所谓的“强制类型转换”,只是把左边的部分视为某种类型,但并不影响对方数据的實際状态。比如
float x = 1.5;
int y = (float)x;
这里,x不管在什么时候,都仍然是float数据,它不会变,y原本就定义为int型的,也不会变,后一句的操作过程,是把浮点数1.5F的內存数据理解成整型数据复制到y处,这个操作的结果,是y把原先表示浮点数的那几个字节二进制编码视为整型解释。

指针的“转换”,仅在把void*赋值给别的类型指针时有用,其他的转换方式,都是风险,会造成数据错失,除非那是你故意而为。


[ 本帖最后由 TonyDeng 于 2015-4-6 21:04 编辑 ]

授人以渔,不授人以鱼。
2015-04-06 20:55
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
得分:0 
恩,这个问题之前的帖子有说过了,例如:
int类型 = float类型+int类型;
这是无提示通过的,哪怕连注意的提示也没有,哪怕数据给截取而缺失了部分。
这是很危险的。
2015-04-07 10:09



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-442915-1-1.html




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

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