Sto*_*Dan -2 c pointers casting
我们假设我有这个代码:
char *pointer;
unsigned int a;
pointer = a;
Run Code Online (Sandbox Code Playgroud)
对我来说,这不会产生任何问题,但我会收到以下警告:
assignment makes pointer from integer without a cast
Run Code Online (Sandbox Code Playgroud)
为什么使用演员阵容更好?我正在使用32位机器.
编辑:通过"这不会产生任何问题",我说它编译并指针存储变量的值a
.
编辑:变量a
实际上会存储一个地址.
Kei*_*son 10
这几乎总是最好不要尝试为整数值分配给一个指针在所有.在极少数情况下,这样的任务是有道理的,演员不仅仅是更好,它是必需的.
指针和整数是不同的类型.在某些情况下,混合它们是有意义的; 在这种情况下,你需要一个强制转换,因为整数和指针之间没有隐式转换(除了特殊情况0
,被视为空指针常量).
char *pointer;
int a; /* or unsigned int a, it's the same either way */
pointer = a;
Run Code Online (Sandbox Code Playgroud)
此分配是非法的(更确切地说,违反约束).符合标准的C编译器必须至少警告它.许多编译器在打印警告后会生成执行隐式转换的代码,但语言不需要这些代码,您不应该依赖它.我个人认为,这样做的编译器并没有给你带来任何好处.
pointer = (char*)a;
Run Code Online (Sandbox Code Playgroud)
这是合法的; 演员告诉编译器生成从转换int
到char*
.但是转换的结果是实现定义的,并且很可能不会产生有意义的结果 - 即使char*
并且int
恰好是相同的大小.
(在您的问题中的代码中,a
尚未初始化.我认为在您没有向我们展示的实际代码中并非如此.)
你究竟想要完成什么?
因为在C:
pointer = a; // not valid in C: a is an int object
// pointer an object of pointer type
Run Code Online (Sandbox Code Playgroud)
如果该语句无效,则需要显式转换(强制转换)以将a
值转换为指针类型.
pointer = (char *) a; // valid assignmnent
Run Code Online (Sandbox Code Playgroud)
有些编译器对你很好,并且会隐式地将int
值转换为指针类型(并添加警告!)但是它们不是必须这样做的,并且编译器可以拒绝编译你的程序.