为指针分配整数时,为什么使用强制转换更好?

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)

这是合法的; 演员告诉编译器生成从转换intchar*.但是转换的结果是实现定义的,并且很可能不会产生有意义的结果 - 即使char*并且int恰好是相同的大小.

(在您的问题中的代码中,a尚未初始化.我认为在您没有向我们展示的实际代码中并非如此.)

你究竟想要完成什么?


oua*_*uah 6

因为在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值转换为指针类型(并添加警告!)但是它们不是必须这样做的,并且编译器可以拒绝编译你的程序.

  • 标准很好的答案,但"客观地"看待它,就像你的孩子问你'为什么不允许',你回答'因为它被禁止'. (3认同)