C语言 为什么使用指针进行强制转换需要在赋值(=)的右侧进行强制转换?

py49o6xq  于 2022-12-11  发布在  其他
关注(0)|答案(1)|浏览(118)

纠正道:

int *x = (int *) malloc(sizeof(int) * 5);
void *x = (int *) malloc(sizeof(int) * 5);

不正确的方式:

int *x (int *) = malloc(sizeof(int) * 5);

这种语法的原因是什么?因为指针是迭代的指针,所以不应该向它强制转换(这样它就知道要迭代多少字节)吗?

lf5gs5x2

lf5gs5x21#

先是狡辩:代码中的=字符表示初始化,而不是赋值。至少在本例中,语义是相似的。
在赋值语句的左侧进行强制转换是没有意义的。
转换运算符接受某种类型的操作数,并生成某种(其他)类型的值。
把强制转换操作符想象成类似于函数调用的东西可能会有所帮助。假设你有一个名为convert_value的函数。这样写是有意义的:

some_type target_object = convert_value(foo);

some_type target_object;
target_object = convert_value(foo);

在赋值语句的左边用函数调用来表达这一点是不合理的,左边表示一个对象,而不是一个值;强制转换将产生一个值。
(You可以将转换为表达式左侧名称的 * 一部分 *,但不能转换为顶级名称。)
在这个特殊的例子中,不需要强制转换。

int *x = (int *) malloc(sizeof(int) * 5);

最好是这样写:

int *x = malloc(5 * sizeof *x);

赋值或初始化会隐式地将void*值转换为目标指针类型,而sizeof *x样式意味着您不必重复类型名称(这可能容易出错,尤其是在以后修改代码时)。

相关问题