【问题标题】:What is the meaning of this expression (char *) in C?这个表达式 (char *) 在 C 中是什么意思?
【发布时间】:2018-08-16 21:32:23
【问题描述】:

这里对 C 非常陌生,我想我只是勉强掌握了指针的概念,但语法有点混乱,所以我很难理解这个表达式 x = (char *) &a; 的含义。

其余功能供参考:

#include<stdio.h> 
int main() 
{ 
   int a; 
   char *x; 
   x = (char *) &a; 
   a = 512; 
   x[0] = 1; 
   x[1] = 2; 
   printf("%d\n",a);   
   return 0; 
}

更具体地说,为什么必须写x = (char *) &amp;a; 而不仅仅是x = &amp;a;?添加的(char *) 对表达式有何影响?

【问题讨论】:

标签: c pointers memory-address


【解决方案1】:

这是cast。它告诉编译器它应该将&amp;a 解释为char* 而不是int*,这是它的实际类型。

不进行此转换会导致编译错误,因为类型不匹配,您基本上是在告诉编译器“我知道我在做什么,我确定这是char*”因此允许你接近类型X,就好像它是类型Y

通常,将X 类型的指针转​​换为Y 并尝试通过Y 类型取消引用它会违反strict aliasing rule,但在这种情况下,因为我们通过char* 进行别名是允许的。

在这种情况下,它允许您访问 int 的各个字节(由 x[] 提供),请注意,根据机器的字节序(大或小),结果会有所不同。

【讨论】:

  • aaah 有这么好的答案,我想知道。你得到了 c++ gold 那是作弊的 :)
  • @Jean-FrançoisFabre 非常抱歉,不会再发生这种情况了。
  • 您可以更清楚地了解什么是强制转换:将值从其原始类型转换为括号中的类型。它没有什么神奇之处。它具有与赋值中的隐式转换完全相同的语义,例如将 int 转换为 float(允许使用);只是为了安全起见,必须明确进行一些转换,至少在过去 30 年左右的时间里,在 OP 的情况下。这种转换可能(如 int -> float)或可能不会(如这里,可能)改变值的物理表示。
  • @SombreroChicken 我会看着你的。
  • 感谢@SombreroChicken 的解释!只是一个简单的问题——这种类型转换是否只需要 char ?
【解决方案2】:

这是一个类型转换。它允许从一种类型到另一种类型的显式转换。

如果你刚刚这样做:

x = &a;

您将尝试将int * 分配给char *。通常不允许在这两种类型之间进行转换,如果这样做,编译器通常会给出警告。

强制转换显式告诉编译器将表达式视为不同的类型。在这种情况下:

 x = (char *) &a;

演员表说要将&amp;a(类型为int *)显式转换为char * 类型的表达式。然后可以将此表达式分配给x,而不会发出警告。

在大多数情况下,从一种指针类型转换为另一种会调用实现或未定义的定义行为,但允许转换为char *,因为它允许您访问由多个字节组成的数据类型的各个字节。但是,您不能做的是使用 char * 指向不同类型的对象以 写入 到该对象。这样做有创建陷阱表示的风险,随后尝试读取原始数据类型将调用undefined behavior

【讨论】:

    猜你喜欢
    • 2021-09-16
    • 2013-11-22
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    相关资源
    最近更新 更多