我理解这些行,但为什么
如果不打印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;
}
答案 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
这将在调试和发布之间有所不同。