C++ 在c+中从int*转换为char*+; 第1行打印“X” 第2行打印“c” 第3行打印11 第4行打印第5行
我明白这些台词,但为什么C++ 在c+中从int*转换为char*+; 第1行打印“X” 第2行打印“c” 第3行打印11 第4行打印第5行,c++,pointers,C++,Pointers,我明白这些台词,但为什么 第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<
- 第5行打印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;
}
#包括“iostream”
使用名称空间std;
int main()
{
int arr[]={88,20,30,40,50,99};
int*ptr1=arr;
int*ptr2=arr+5;
cout因为(char*)ptr2-(char*)ptr1
是地址的差异。那么5*sizeof(int)=20
在您的(我猜)32位平台中。在编译程序的环境中sizeof(int)
等于4
。即int类型的每个对象占用4个字节(字符).在ptr2和ptr1之间有5个整数。指向同一数组元素的两个指针的差值是它们之间的元素数。
这就是所谓的指针算术。因此ptr2-ptr1给出5。但是如果您将这些指针强制转换为typechar*
,那么在这些指针之间有5*sizeof(int)
个字符,它们等于20。要获得您期望的输出,请使用:
(char)*ptr2-(char)*ptr1
答案绝对正确让我根据代码一步一步地解释你的答案:
cout<<(char*)ptr1<<endl;//line1
如果我们两者都减去,那么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-这是数组中的第一个索引。
ptr2指向内存中的这些字节:99,0,0,0。
所以前两行输出两个以null结尾的字符串:X和c
第三行输出字符c和X之间的差值,即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@▼ñ¸4
C╠╠╠╠╠╠╬H@▼ñ¸4
11
5
五,
这在调试和发布之间会有所不同。什么int*ptr2…cout5元素,每个元素4个字节,5*4=20。所以它打印20!应该可以对配件名称进行投票:)32位平台是从哪里来的?因为int
依赖于平台。这取决于各种因素:例如,在unix世界中,可以有不同的标准:长度为int
64位的ILP64,长度为int
32位的LP64和LLP64。最后,我的意思是,8/16/64位平台的大小是不允许的of(int)=4
。顺便说一句,我不知道是谁否决了我的答案……“…在64位系统上,它将是8*5=40”不,在64位上,如果int
的大小为4,您仍然会得到20。@alk内存或强制转换是通过Void指针完成的,而不是通过int完成的。int my的大小为4字节,但由于通过Void指针强制转换,地址分配的距离为8字节。即使int的大小为4,也会填充左字节这是基本指针a算术(与平台无关):无论指针/地址的大小如何,以字节为单位的指针差异都是*sizeof()
。对于16位、32位、64位……都是一样的。检查64位的大小(char*);指针的大小取决于处理器的位,指针的大小不同。但对于OP的第5行,这并不重要。
cout<<ptr2-ptr1<<endl;//line4
cout<<(char*)ptr2-(char*)ptr1<<endl;//line5
(char *)ptr1 --- Address = 10
(char *)ptr2 --- Address = 30
32 bit sizeof void* = 4
64 bit sizeof void* = 8
char arr[] = { 88, 20, 30, 40, 50, 99 };
char *ptr1 = arr;
char *ptr2 = arr + 5;