[英]Why does casting with a pointer require casting on the right side of the assignment (=)?
正确方法:
int *x = (int *) malloc(sizeof(int) * 5);
void *x = (int *) malloc(sizeof(int) * 5);
不正确的方式:
int *x (int *) = malloc(sizeof(int) * 5);
这种语法的原因是什么? 因为指针是迭代的指针,所以不应该对它进行强制转换(这样它就知道要迭代多少字节)?
首先是一个狡辩:代码中的=
字符表示初始化,而不是赋值。 语义是相似的,至少在这种情况下是这样。
在赋值的左侧强制转换是没有意义的。
强制转换运算符采用某种类型的操作数并产生某种(其他)类型的值。
将转换运算符想象成类似于 function 调用的东西可能会有所帮助。 假设您有一个名为convert_value
的 function。 写是有意义的:
some_type target_object = convert_value(foo);
要么
some_type target_object;
target_object = convert_value(foo);
没有合理的方式来表达作业左侧的 function 调用。 左侧表示一个 object,不是一个值; 强制转换产生一个值。
(您可以在表达式的左侧将强制转换作为名称的一部分,但不能在顶层。)
在这种特殊情况下,不需要强制转换。 而不是
int *x = (int *) malloc(sizeof(int) * 5);
最好这样写:
int *x = malloc(5 * sizeof *x);
赋值或初始化会将void*
值隐式转换为目标指针类型,而sizeof *x
样式意味着您不必重复类型名称(这可能容易出错,特别是如果稍后修改代码) .
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.