繁体   English   中英

为什么用指针进行转换需要在赋值的右侧进行转换 (=)?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM