在c++中从int*转换为char*

Casting from int* to char* in c++

本文关键字:转换 char int c++ 中从      更新时间:2023-10-16
  • 第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

这将因调试和发布而异。