作者FFz (澎湖.仙人掌.234)
站内C_and_CPP
标题[问题] pointer void * a = (void *) i;
时间Tue Mar 31 12:25:33 2009
请教一个 Pointer的情况
有两个变数是这样宣告的
void *arg;
int i = 10;
arg = (void *) i;
不懂的是 为而arg在assign时是这样做呢
而不是这样
arg = &i;
麻烦各位帮我解惑
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.123.105.238
1F:推 QQ29:原因是void *能指向任何东西嘛? 03/31 12:33
2F:→ QQ29:可是我有个疑惑 我照你这样写 会出现警告 03/31 12:34
3F:→ QQ29:warning C4312: '型别转换' : 将 'int' 转换为较大的'void * 03/31 12:34
4F:→ QQ29:不是应该一样size都是4吗???? 03/31 12:34
5F:推 yshihyu:应该是要 arg = (void *) &i; 才对 03/31 12:34
6F:→ QQ29:照他这样写要用的时候 直接cast成 int就可以了 03/31 12:35
7F:→ yshihyu:不会有警告~ 两边都是 void* 语法合法 03/31 12:35
8F:推 QQ29:喔我是说他这种写法 03/31 12:37
9F:推 yshihyu:它应该要练习用 void* 03/31 12:38
10F:推 QQ29:这样写也可以过 难道是void*无敌吗? 为啥会有警告说大小不合 03/31 12:40
11F:推 yshihyu:arg = (void *) i; 这语法没错~ 但用错 把这样是把 10 03/31 12:43
12F:→ yshihyu:当作位址给 arg ... 10 这位址根本不合法 03/31 12:44
13F:推 VictorTom:arg = (void*)&i 和 (void*)i 都合法, 只是结果不同.... 03/31 12:59
14F:→ VictorTom:10这个位址不合法没错, 不过偶尔好像也会见到这种用cast 03/31 13:00
15F:→ VictorTom:来做某写特别的passing/处理的样子@_@" 03/31 13:01
16F:推 VictorTom:顺便回2F, 用DevC++ 4.9.9.2测好像不会有warning.... 03/31 13:03
17F:→ VictorTom:话说回来, 小转大应该OK, 大转小通常才可能有问题不是?? 03/31 13:04
18F:推 yshihyu:这边没size 问题~ 这边都是4byte 03/31 13:06
19F:推 VictorTom:在32 bits环境应该是都OK; 不过小弟是说2F说的warning 03/31 13:08
20F:→ VictorTom:假如真的不match, 小转大应该也不会是什麽问题啊@_@" 03/31 13:09
21F:推 QQ29:可是他们不是同样大小嘛? 03/31 13:30
22F:推 VictorTom:我这边测出来是, 所以您的结果是挺奇怪的:) 03/31 13:34
23F:→ VictorTom:刚刻意测一个char c=10; void *p=(void*)c; 03/31 13:35
24F:→ VictorTom:这个例子DevCpp就会报warning: difference size了@_@" 03/31 13:35
25F:→ VictorTom:所以Q大您真要查, 就sizeof()查一下两个变数吧....XD 03/31 13:36
26F:推 yshihyu:char c=10; void *p=(void*)c; // 这样会出现警告是正常的 03/31 13:45
27F:→ yshihyu:(void*)c; 又不是把 c 真的把 变成 4byte 03/31 13:46
28F:推 yshihyu:void *p=(void*)&c; 改成这样就OK 03/31 13:49
29F:推 yshihyu:应该是说 指标型态转型只可以用在 address , c 是整数型态 03/31 13:52
30F:推 VictorTom:我懂y大您的意思, 不过我现在就是没有要取address.... 03/31 13:55
31F:→ VictorTom:现在就是纯粹刻意要把一个数cast成address来用.... 03/31 13:56
32F:推 yshihyu:对~ (void*) (int*) etc 指标这种转换必须用在address 03/31 13:56
33F:→ VictorTom:用char转只是要做出Q大遇到的warning问一下size的问题. 03/31 13:56
34F:→ yshihyu:&c 才是address of ... c 是整数 03/31 13:56
35F:→ yshihyu:我印象中我以前在书上看过~ 不过我忘记在哪本书看过 03/31 13:57
36F:→ VictorTom:所以char是刻意搞的特例; 但是int->void*这种case不是没 03/31 13:57
37F:→ VictorTom:有, 有可能design上int本来的值就是个address, 这样做的 03/31 13:57
38F:→ VictorTom:好坏先不论, 但是的确有这种int值存address的作法.... 03/31 13:58
39F:→ yshihyu: void *p=(void*)(int)c; 你改这样编译你就知道 03/31 13:58
40F:→ yshihyu:这样阿~ 03/31 14:00
41F:→ MOONRAKER:widening coercion理论上的确不该出warning 03/31 14:01
42F:推 VictorTom:用VC2005试int i=10; void *p=(void*)i; 的个case.... 03/31 14:04
43F:→ VictorTom:真的有 convert "int to void*" of greater size的warn 03/31 14:06
44F:→ VictorTom:不过对int和void* sizeof都是4, 是小弟我英文不好吗Orz 03/31 14:06
45F:→ VictorTom:话说上面那段修正一下, 通常会用unsigned的而非signed:) 03/31 14:07
46F:推 yshihyu:我觉得这边译器有差异~ 可能要查ANSI .. 03/31 14:11
47F:推 VictorTom:补充, VC2005试char c=10; void *p=(void*)c; 的case. 03/31 14:11
48F:→ VictorTom:竟然完全没有warning, 我开始怀疑是MS自己在耍宝....Orz 03/31 14:12
49F:→ VictorTom:照y大的加(void*)(int)c; DevCpp没warn, VC2005有warn. 03/31 14:12
50F:推 yshihyu:其实这种情况很多~ 满多小地方ANSI 也没定义~编译器实作 03/31 14:13
51F:→ yshihyu:上就有差异 03/31 14:13
52F:→ VictorTom:就像y大说的, 看来compiler有差, 那留给强者查吧....XD 03/31 14:13
53F:推 cplusplus:语意问题罢了 其实想怎麽写都可以 知道自己在干嘛就好 03/31 14:14
54F:推 VictorTom:的确是语意问题, 只是有时候这种warning可能会造成 03/31 14:15
55F:→ VictorTom:prefast build过不了吧? 如果是compiler问题就满鸟的Orz 03/31 14:16
56F:→ OpenBigJue:....上面是吵起来了吗... 03/31 14:55
57F:→ OpenBigJue:其实这只是存取特定记忆体位址的值罢了 嵌入式常用到 03/31 14:57
58F:推 sunneo:没有吵啊 只是讨论热烈 03/31 19:53
59F:→ sunneo:MSVS你可以试试看,你用unsigned long long 转void*反而没有 03/31 19:54
60F:→ sunneo:但事实上sizeof(void*)却又是4 byte 所以有可能是....... 03/31 19:54
61F:→ sunneo:可能是64位元可携性警告吧,把它关掉看看 03/31 19:55
62F:推 VictorTom:谢楼上:) 话说MSVS有些warn真的满烦的, 还有一个常见的 03/31 21:52
63F:→ VictorTom:就是str###()和str###_s(), 上次差点不小心把func换掉. 03/31 21:53
64F:→ VictorTom:幸好主管提醒, 不然挂掉OS build的话小弟就要被定了Orz 03/31 21:54
65F:→ VictorTom:挂掉其他OS的build, 漏字; 本来想用#define / #if来弄. 03/31 21:55
66F:→ VictorTom:偏偏就是有地方用到要回传char*的, 好像是strstr吧@_@" 03/31 21:56