这里对C很新,我认为我几乎没有掌握指针的概念,但语法有点令人困惑,所以我无法理解这个表达式#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 *)
?添加的var str = 'E+Error+E+E+LATTE+E';
console.log(str.replace(/E/g, " E ")); // Replaces all "E" occurences
// Or, if you only want the "E"s that are delimited by "+"
// 1. split the string into an array at the "+" chars
// 2. enumerate that array (map)
// 3. check the array item's length to see if it is just one character (val.length === 1)
// 4. if so, return " E " to the new array created by map()
// 5. if not, return the original array item to the new array creaed by map()
// 6. Join all the items in the new array with a "+" and return that string
console.log(str.split("+").map(val => val.length === 1 ? " E " : val).join("+"));
做了什么来改变表达式?
答案 0 :(得分:8)
这是一个cast。它告诉编译器它应该将&a
解释为char*
而不是int*
,这是它的实际类型。
由于类型不匹配,不进行此转换将导致编译错误,您基本上告诉编译器“我知道我在做什么,我确定这是char*
”从而允许您接近类型X
,就好像它是Y
类型。
通常情况下,将X
类型的指针投射到Y
并尝试通过Y
类型取消引用它会违反strict aliasing rule,但在这种情况下,因为我们是别名通过char*
允许。
在此上下文中,它允许您访问int
的各个字节(按x[]
),请注意结果将根据计算机的字节顺序(大或小)而有所不同
答案 1 :(得分:3)
这是类型广播。它允许从一种类型显式转换为另一种类型。
如果你刚刚这样做了:
x = &a;
您将尝试将int *
分配给char *
。通常不允许在两种类型之间进行转换,如果您这样做,编译器通常会发出警告。
强制转换显式告诉编译器将表达式视为不同的类型。在这种情况下:
x = (char *) &a;
演员表示要将&a
明确转换为类型int *
的表达式char *
。然后可以将此表达式分配给x
而不发出警告。
在大多数情况下,从一种指针类型转换为另一种指针类型会调用实现或未定义的已定义行为,但是允许转换为char *
,因为它允许您访问由多个字节组成的数据类型的各个字节。然而,你不能做的是使用char *
指向不同类型的对象写到该对象。这样做有可能创建陷阱表示,随后尝试读取原始数据类型将调用undefined behavior。