如何解决C ++中指针的类型转换
假设指针大小为4
#include<stdio.h>
int main()
{
int arr[] = {10,20,30,40,50,60};
int *ptr1 = arr;
int *ptr2 = arr + 5;
printf("Number of bytes between two pointers are: %d",(char*)ptr2 - (char*) ptr1);
return 0;
}
输出:20
在此程序中,为什么在类型转换中将输出打印为sizeof指针?为什么不打印5?
解决方法
在此程序中,为什么在类型转换中将输出打印为sizeof指针?为什么不打印5?
强制转换为char*
。
ptr2
和ptr1
之间的偏移量为5
,只要指针的类型为int*
。
当您将指针显式转换为char*
时,就是在要求程序计算指针之间的偏移量,就好像它们是char*
一样。您的程序说,它是20
,等于5*sizeof(int)
。
数组的每个元素在内存中占据4个字节的空间。
因此,可以按以下方式进行计算:
- 指针之间的字节数=
char_type_cast of (pointer2 - pointer1)
- 指针大小的空格=
(bytes_between_pointers / 4)
- 整数大小的空间=
int_type_cast of (pointer2 - pointer1)
工作代码:
#include<stdio.h>
int main()
{
int arr[] = {10,20,30,40,50,60};
int *ptr1 = arr;
int *ptr2 = arr + 5;
/*
1 pointer = 4 bytes
Byte-sized spaces = char_type_cast of (ptr2 - ptr1)
Pointer-sized spaces = byte_spaces / 4
Integer-sized spaces = int_type_cast of (ptr2 - ptr1)
*/
int byteSpaces = ((char*)ptr2 - (char*)ptr1);
int pointerSpaces = (byteSpaces / 4);
int integerSpaces = ((int*)ptr2 - (int*)ptr1);
printf("Pointer 1 = %d\n",*ptr1);
printf("Pointer 2 = %d\n",*ptr2);
printf("\nByte sized spaces between two pointers = %d\n",byteSpaces);
printf("\nPointer sized spaces between pointers = %d\n",pointerSpaces);
printf("\nInteger sized spaces between pointers = %d\n",integerSpaces);
return 0;
}
输出:
Pointer 1 = 10
Pointer 2 = 60
Byte sized spaces between two pointers = 20
Pointer sized spaces between pointers = 5
Integer sized spaces between pointers = 5
,
除@R sahu的答案外,请查看此代码并通过调试器运行它。您会发现t1 = '\n'
和t2 = '<'
。减为20
代码:
#include<stdio.h>
#include <iostream>
int main() {
int arr[] = { 10,60 };
int* ptr1 = arr;
int* ptr2 = arr + 5;
auto* t1 = ( char* ) ptr1;
auto* t2 = ( char* ) ptr2;
std::cout << ( int ) (t1 - t2);
printf("Number of bytes between two pointers are: %d",( char* ) ptr2 - ( char* ) ptr1);
return 0;
}
,
对指针进行算术运算时,它以指向类型的大小的倍数运行。因此,以下分配是等效的:
doc = MyModel.objects.find(<model-key> = <model-val>,<embedded-doc-key>__<embedded-doc-lookup-key> = <lookup-key-val>)
doc.update(set__<embedded-doc-key>__S__<embedded-doc-lookup-key> = <new-val>)
无论哪种方式,它都是指向数组int* ptr2 = arr + 5;
int* ptr2 = &arr[5];
中第6个元素的指针。
由于arr
的边上显然有4个字节,因此当您将指针投射到int
并从另一个减去一个时,指针之间的距离将以新的倍数计算指向类型-char*
的大小,为1。第六char
和int
开头之间的差是arr
或20个字节。
有关指针的一些背景知识,请考虑使用my answer here。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。