我编写了以下代码,将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 ++中工作。
谢谢。
答案 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
一样。