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

Converting int value to char pointer difference in C and C++

本文关键字:char 转换 指针 int C++      更新时间:2023-10-16

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

int i = 54;
char *ii;
ii = &i;
printf("%dn", *ii);

输出为:

54

而当我用C++写同样的东西时,它不起作用。

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

输出为:

6

有人能解释一下为什么会发生这种情况吗?我该如何在C++中工作。

提前谢谢。

当您这样调用printf时:

printf("%dn", *ii);

%d格式说明符表示给定的int参数将打印为int。尽管您传递的是char,但由于printf是一个可变函数,因此它被提升为int,因此它与格式说明符匹配。

当您使用cout:输出时

cout<<*ii;

<<运算符具有用于char的过载。由于右侧具有类型char,因此使用的是重载。<<的那个特定实例将参数打印为char。由于ASCII代码54对应于字符'6',所以这就是打印的内容。

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

不同并不相同。试试这个:

#include <cstdio>
#include <iostream>
int main() {
int i = '6';
char *ii = reinterpret_cast<char*>(&i);
std::printf("%cn", *ii);
std::printf("%dn", *ii);
std::cout << *ii << 'n';
std::cout << (int)*ii << 'n';
}

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

在对printf的调用中,*ii所指向的char值在函数调用中被提升为int。当小于int的类型是采用变量参数列表(如printf)的函数的变量部分的参数时,它们会被提升。

第一个CCD_ 28语句将CCD_ 29的值打印为字符值;你会得到"6"。第二个将其打印为整数值;您将得到代表字符'6'的任何值(在ASCII中,它是54,这可能是您将看到的)。

对CCD_ 31的第一次插入插入CCD_;流插入器是为整型重载的,所以您得到的插入器采用类型为char的参数,它显示值所代表的字符,就像第一个printf调用一样。

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