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

时间:2015-02-26 08:21:27

标签: c++ pointers

  • 第1行打印'X'
  • 第2行打印'c'
  • 第3行打印11
  • 第4行打印5.

我理解这些行,但为什么

  • 第5行打印20

如果不打印11而不是20,因为第1行和第2行打印'X'和'c'。

非常感谢您的帮助。

#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;
}

5 个答案:

答案 0 :(得分:4)

在编译程序的环境中sizeof( int )等于4。也就是说int类型的每个对象占用4个字节(字符)。在ptr2和ptr1之间有5个整数。指向同一数组的元素的两个指针的差异是它们之间的元素数量。 它就是所谓的指针算法。因此ptr2 - ptr1给出了5.但是如果你将这些指针强制转换为类型char *,那么在这些指针之间有5 * sizeof( int )个字符等于20。

答案 1 :(得分:1)

因为(char*)ptr2-(char*)ptr1是地址的差异。然后在你的(我猜)32位平台上5*sizeof(int) = 20

答案 2 :(得分:1)

获得您期望使用的输出:

(char)*ptr2-(char)*ptr1

答案 3 :(得分:0)

答案是绝对正确的让我按照代码逐步解释你的答案:

cout<<(char*)ptr1<<endl;//line1

由于ptr1 = arr,因此第一个char为88,因此打印X

cout<<(char*)ptr2<<endl;//line2

由于ptr1 = arr +5,因此第五个字符为99,因此打印c

cout<<('c'-'X')<<endl;//line3

因为&#39; c&#39; = 99和&#39; X&#39; = 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,因为它取决于sizeof void *

32 bit sizeof void* = 4
64 bit sizeof void* = 8

因此在32位系统上答案将是4 * 5 = 20而在64位系统上它将是8 * 5 = 40

答案 4 :(得分:0)

第一个ptr1指向内存中的这些字节:88,0,0,0 - 这是数组中的第一个索引 ptr2指向内存中的这些字节:99,0,0,0 所以前两行输出两个空终止字符串:X和c。

第三行输出字符c和X之间的差值,即int值。

第四个值是关于这些指针指向的两个指针之间的差异(数组中的相对位置)。这是一个int数。

最后一个转换为char *,其中char是1个字节,这使得它比int小4倍(int是4个字节大)。所以区别在于(数组位置差异)*(int的大小)= 5 * 4 = 20.这个值是int,这就是你看到数字20的原因。

尝试将所有这些内容更改为char并查看差异:

char arr[] = { 88, 20, 30, 40, 50, 99 };
char *ptr1 = arr;
char *ptr2 = arr + 5;

突然,前两行不再是一个字符,因为(char *)字符串不再有0个终止符。

X¶▲(2c╠╠╠╠╠╠╬H@▼N4
c╠╠╠╠╠╠╬H@▼N4
11个
5
5

这将在调试和发布之间有所不同。