在 C++ 中从 int* 转换为 char*
Casting from int* to char* in c++
- 第 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;
}
因为(char*)ptr2-(char*)ptr1
是地址的不同。然后 5*sizeof(int) = 20
在你的(我猜)32 位平台上。
在编译程序的环境中sizeof( int )
等于4
。即每个int类型的对象占用4个字节(字符)。在 ptr2 和 ptr1 之间有 5 个整数。指向同一个数组元素的两个指针之差是它们之间的元素个数。
这就是所谓的指针运算。因此 ptr2 - ptr1 给出 5。但是如果你将这些指针转换为 char *
类型,那么在这些指针之间有 5 * sizeof( int )
个字符等于 20.
要获得您期望的输出,请使用:
(char)*ptr2-(char)*ptr1
答案绝对正确让我根据代码一步步解释你的答案:
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 因为它取决于 sizeof void *
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
这会因调试和发布而异。
- 第 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;
}
因为(char*)ptr2-(char*)ptr1
是地址的不同。然后 5*sizeof(int) = 20
在你的(我猜)32 位平台上。
在编译程序的环境中sizeof( int )
等于4
。即每个int类型的对象占用4个字节(字符)。在 ptr2 和 ptr1 之间有 5 个整数。指向同一个数组元素的两个指针之差是它们之间的元素个数。
这就是所谓的指针运算。因此 ptr2 - ptr1 给出 5。但是如果你将这些指针转换为 char *
类型,那么在这些指针之间有 5 * sizeof( int )
个字符等于 20.
要获得您期望的输出,请使用:
(char)*ptr2-(char)*ptr1
答案绝对正确让我根据代码一步步解释你的答案:
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 因为它取决于 sizeof void *
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
这会因调试和发布而异。