C 中这个表达式 (char *) 是什么意思?
What is the meaning of this expression (char *) in C?
这里是 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 *) &a;
而不是 x = &a;
?添加的 (char *)
对改变表达式有何作用?
这是一个 cast。它告诉编译器它应该将 &a
解释为 char*
而不是 int*
这是它的实际类型。
不进行此转换会导致编译错误,因为类型不匹配,您基本上是在告诉编译器 "I know what I'm doing and I'm sure this is a char*
" 从而允许您接近类型 X
就好像它是输入 Y
.
通常,将类型 X
的指针转换为 Y
并尝试通过类型 Y
取消引用它会违反 strict aliasing rule 但在这种情况下,因为我们'通过 char*
重新别名是允许的。
在此上下文中,它允许您访问 int
的各个字节(按 x[]
),请注意,结果将根据机器的字节顺序(大或很少)。
这是类型转换。它允许从一种类型显式转换为另一种类型。
如果您刚刚这样做:
x = &a;
您将尝试将 int *
分配给 char *
。通常不允许在这两种类型之间进行转换,如果您这样做,编译器通常会发出警告。
强制转换明确告诉编译器将表达式视为不同的类型。在这种情况下:
x = (char *) &a;
强制转换表明要将类型为 int *
的 &a
显式转换为类型为 char *
的表达式。然后可以将此表达式分配给 x
而不会出现警告。
在大多数情况下,从一种指针类型转换为另一种指针类型会调用实现或未定义的定义行为,但是允许转换为 char *
,因为它允许您访问由多个数据类型组成的单个字节字节。但是,您不能做的是使用 char *
指向不同类型的对象,然后 write 到该对象。这样做有创建陷阱表示的风险,随后尝试读取原始数据类型将调用 undefined behavior.
这里是 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 *) &a;
而不是 x = &a;
?添加的 (char *)
对改变表达式有何作用?
这是一个 cast。它告诉编译器它应该将 &a
解释为 char*
而不是 int*
这是它的实际类型。
不进行此转换会导致编译错误,因为类型不匹配,您基本上是在告诉编译器 "I know what I'm doing and I'm sure this is a char*
" 从而允许您接近类型 X
就好像它是输入 Y
.
通常,将类型 X
的指针转换为 Y
并尝试通过类型 Y
取消引用它会违反 strict aliasing rule 但在这种情况下,因为我们'通过 char*
重新别名是允许的。
在此上下文中,它允许您访问 int
的各个字节(按 x[]
),请注意,结果将根据机器的字节顺序(大或很少)。
这是类型转换。它允许从一种类型显式转换为另一种类型。
如果您刚刚这样做:
x = &a;
您将尝试将 int *
分配给 char *
。通常不允许在这两种类型之间进行转换,如果您这样做,编译器通常会发出警告。
强制转换明确告诉编译器将表达式视为不同的类型。在这种情况下:
x = (char *) &a;
强制转换表明要将类型为 int *
的 &a
显式转换为类型为 char *
的表达式。然后可以将此表达式分配给 x
而不会出现警告。
在大多数情况下,从一种指针类型转换为另一种指针类型会调用实现或未定义的定义行为,但是允许转换为 char *
,因为它允许您访问由多个数据类型组成的单个字节字节。但是,您不能做的是使用 char *
指向不同类型的对象,然后 write 到该对象。这样做有创建陷阱表示的风险,随后尝试读取原始数据类型将调用 undefined behavior.