在C和C++中,将int值转换为char指针的差异
Converting int value to char pointer difference in C and C++
我写了以下代码将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
一样。
相关文章:
- 将无符号char*转换为std::istream*C++
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 将函数参数"const char*"转换为"std::string_view"是
- C ++如何在使用"tolower"时将char转换为int
- 有没有办法在C++的赋值中将"char**"转换为"double"?
- JavaCPP 错误:无法将参数"1"的"char*"转换为"Abc*
- 为什么从 char 转换为 std::byte 可能是未定义的行为?
- 如何在虚幻引擎4中将char*转换为TCHAR?
- C++:将模板类型 char 转换为 std::string
- strcmp/char* 转换无法按预期工作
- C++中的SQLite char*转换
- 无法从 const char* 转换为 const char *&
- 在 C++ 中将 char 转换为 int,而无需符号位传播
- 如果必须包含西里尔字符,如何将 char* 转换为 std::string?
- 试图使用strCMP时的char转换错误
- 无法从'const char *'转换为'LPCTSTR'
- 将 std::vector<char> 转换为字符* 会导致字符缺陷
- 使用 static_cast 将 char 转换为 int c++
- 如何在 C++(MFC) 中将 char* 转换为 LPCTSTR
- 无法将const char转换为字符串构造字符串