Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在c+中从int*转换为char*+; 第1行打印“X” 第2行打印“c” 第3行打印11 第4行打印第5行_C++_Pointers - Fatal编程技术网

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
?

它是否应该打印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;
}
#包括“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。但是如果您将这些指针强制转换为type
char*
,那么在这些指针之间有
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;