在c++中从int*转换为char*
Casting from int* to char* in c++
- 第1行打印"X"
- 第2行打印"c"
- 第3行打印11
- 第4行打印5
我理解这些线路,但为什么
- 第5行打印20
因为第1行和第2行打印的是"X"answers"c",所以应该不打印11而不是20吗。
非常感谢你的帮助。
#include "iostream"
using namespace std;
int main()
{
int arr[] = {88, 20, 30, 40, 50, 99};
int *ptr1 = arr;
int *ptr2 = arr + 5;
cout<<(char*)ptr1<<endl;//line 1
cout<<(char*)ptr2<<endl;//line2
cout<<('c'-'X')<<endl;//line3
cout<<ptr2-ptr1<<endl;//line4
cout<<(char*)ptr2-(char*)ptr1<<endl;//line5
return 0;
}
在编译程序的环境中,sizeof( int )
等于4
。也就是说,int类型的每个对象占用4个字节(字符)。在ptr2和ptr1之间有5个整数。指向同一数组元素的两个指针的区别在于它们之间的元素数量。这就是所谓的指针算术。因此ptr2-ptr1给出5。但是,如果将这些指针强制转换为类型char *
,那么在这些指针之间有等于20的5 * sizeof( int )
字符。
获得您期望使用的输出:
(char)*ptr2-(char)*ptr1
因为(char*)ptr2-(char*)ptr1
是地址的差异。然后5*sizeof(int) = 20
在你的(我猜)32位平台上。
答案绝对正确,让我根据代码一步一步地解释你的答案:
cout<<(char*)ptr1<<endl;//line1
由于ptr1=arr,因此第一个字符为88,因此打印X
cout<<(char*)ptr2<<endl;//line2
由于ptr1=arr+5,因此第五个字符为99,因此打印c
cout<<('c'-'X')<<endl;//line3
由于"c"=99和"X"=88的值,因此答案是11
cout<<ptr2-ptr1<<endl;//line4
由于arr是一个数组,第5个元素和第0个元素之间的距离5-0=5
cout<<(char*)ptr2-(char*)ptr1<<endl;//line5
这里发生的事情是减去两个地址,答案是作为两个地址的差值提供的,例如
(char *)ptr1 --- Address = 10
(char *)ptr2 --- Address = 30
如果我们两者相减,则30-10=20。为什么它是20,因为它取决于空隙的大小*
32 bit sizeof void* = 4
64 bit sizeof void* = 8
因此,在32位系统上,答案为4*5=20,在64位系统上为8*5=40
第一个ptr1指向内存中的这些字节:88,0,0,0-这是数组中的第一个索引
ptr2指向内存中的这些字节:99,0,0,0。
因此,前两行输出两个空终止字符串:X和c.
第三行输出字符c和X之间的差值,即int值。
第四个值是两个指针之间关于这些指针指向的内容(数组中的相对位置)的差异。这是一个整数。
最后一个被强制转换为char*,其中char是1个字节,这使得它比int小4倍(int是4个字节大)。所以差是(数组位置差)*(int的大小)=5*4=20。这个值是int,所以这就是你看到数字20的原因。
试着把所有这些int都改成char,看看区别:
char arr[] = { 88, 20, 30, 40, 50, 99 };
char *ptr1 = arr;
char *ptr2 = arr + 5;
突然之间,前两行不再是一个字符,因为(char*)字符串不再有0终止符。
X¶▲(2c╠╠╠╠╠╠╬H@▼4
c╠╠╠╠╠╠╬H@▼4
11
5
5
这将因调试和发布而异。
- 将无符号char*转换为std::istream*C++
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 使用char类型将decimal转换为string,将string转换为decimal
- 如何在对<char>C++程序进行逆向工程的同时将 std::basic_string 转换为 Rust 可读值?
- 将函数参数"const char*"转换为"std::string_view"是
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- C ++如何在使用"tolower"时将char转换为int
- 有没有办法在C++的赋值中将"char**"转换为"double"?
- 如何使用多次 memcpy 转换回 std::vector<unsigned char>?
- 将"uint8_t"(从套接字读取)隐式转换为"char"安全吗
- JavaCPP 错误:无法将参数"1"的"char*"转换为"Abc*
- 将传入的网络"char*"数据转换为"uint8_t"并返回的安全方法是什么?
- 转换char*时的值不同
- Boost Python 不会自动转换 char* 数据成员
- 除了转换char*之外,还有更好的方法来获得一个变量值吗?
- 如何跨平台转换char*到long long(64位)
- 用atof转换char数组中的浮点数
- C转换char[]为时间戳;