0

我有一个像这样的代码:

int main(void)
{
    char mychar = 'd';
    int *ptr = malloc(sizeof(*ptr)) ;

    *ptr = (char) 'c' ; // *ptr = (char*) 'c'; Gives the exact same result

    printf("%c\n",*ptr);
    memset(ptr,mychar,sizeof(*ptr));
    printf("%c\n",*ptr);
    free(ptr);
    printf("%c\n",*ptr);
    return 0 ;
}

该代码对指针样式转换和数据类型转换给出了相同的结果。
应该使用这两种风格中的哪一种或被认为是一种好的做法,为什么?

*ptr = (char) 'c' ; 
*ptr = (char*) 'c';
4

2 回答 2

7

两者都不。

*ptr和都是'c'类型int。不需要演员表。

(是的,C 中的字符常量的类型是int,而不是char。这是违反直觉的,但这是有历史原因的。请注意,C++ 字符常量的类型是char。)

投进*ptr = (char) 'c';相对无害;它将 的int值转换'c'char,并将结果隐式转换回int。由于c保证可以表示为 a char,因此不会导致错误。

*ptr = (char*) 'c';中,您的编译器应该会给您一条错误消息。您正在将一个常int量值转换为一个指针,然后将该指针值分配给一个int没有强制转换的值。这是一个“违反约束”,这意味着符合标准的编译器必须诊断它。如果您没有,请了解如何做到这一点。

如果分配通过编译器,它可能会做你想做的事。整数类型和指针类型之间的转换通常只是重新解释命名表示的位,因此将 an 转换int为 achar*再转换回 anint可能会给您原始int值。但不能保证。

即使在不同的算术类型之间,通常也不需要强制转换。例如,如果你写了:

char ch = 'c';
int i;
i = ch;

在这种情况下,赋值的右侧确实是 type char,因为它是该类型对象的名称,而不是字符常量。赋值隐式地ch将from type的值转换char为 type int。你可以写:

i = (int)ch;

相反,但这只是指定了在没有强制转换的情况下完成的相同转换。而且容易出错;它引入了错误类型的机会,而不是让编译器为您处理它。

一般来说,演员阵容应该被怀疑。

于 2012-09-28T09:15:04.607 回答
1

两者都很糟糕。

'c'实际上是一个int. 所以你不必投。您可以直接分配它:

*ptr = 'c';
于 2012-09-28T09:12:43.323 回答