在C和C ++中将int值转换为char指针差异

时间:2019-01-05 14:04:17

标签: c++ c pointers casting

我编写了以下代码,将int值转换为char指针,这在C语言中有效。

int i = 54;
char *ii;
ii = &i;
printf("%d\n", *ii);

输出为:

54

当我用C ++编写相同代码时,它不起作用。

int i = 54;
char *ii;
ii =  (char *)&i;
cout<<*ii;

输出为:

6

有人可以解释为什么会发生这种情况,以及如何使它在C ++中工作。

谢谢。

2 个答案:

答案 0 :(得分:2)

当您像这样呼叫printf时:

printf("%d\n", *ii);

%d格式说明符意味着给定的int参数将被打印为int。即使您传递的是char,但由于printf是可变参数函数,它会提升int,因此它与格式说明符匹配。

使用cout输出时:

cout<<*ii;

<<运算符的char重载。由于右侧的类型为char,因此使用了重载。 <<的特定实例将参数打印为char。由于ASCII码54对应于字符'6',因此将被打印出来。

如果以%c格式使用printf,并且在*ii调用中将int强制转换为cout,则会得到相反的结果

答案 1 :(得分:1)

不同是不一样的。试试这个:

#include <cstdio>
#include <iostream>

int main() {
    int i = '6';
    char *ii = reinterpret_cast<char*>(&i);
    std::printf("%c\n", *ii);
    std::printf("%d\n", *ii);
    std::cout << *ii << '\n';
    std::cout << (int)*ii << '\n';
}

i初始化为'6'只是一种澄清。

在对printf的调用中,char指向的*ii的值在函数调用中被提升为int。小于int的类型是接受带有可变参数列表的函数的可变部分(例如printf)的参数时被提升。

第一个printf语句将*ii的值打印为字符值;您将获得“ 6”。第二个将其打印为整数值;您将得到代表字符'6'的任何值(ASCII为54,这可能是您看到的内容)。

第一次插入std::cout会插入char值;流插入器对于整数类型是重载的,因此您将获得使用类型为char的参数的插入器,它会显示值表示的字符,就像第一次调用printf一样。

第二次插入std::cout会插入*ii的整数值,就像第二次调用printf一样。