int*pint是什么;pint=(int*)数据;意思是
What does int* pint; pint = (int*)data; mean?
我正在阅读指针在这里是如何工作的,因为我正在努力理解qsort((。但指南给出了这个代码:
// increaser
#include <iostream>
using namespace std;
void increase (void* data, int psize)
{
if ( psize == sizeof(char) )
{ char* pchar; pchar=(char*)data; ++(*pchar); }
else if (psize == sizeof(int) )
{ int* pint; pint=(int*)data; ++(*pint); }
}
int main ()
{
char a = 'x';
int b = 1602;
increase (&a,sizeof(a));
increase (&b,sizeof(b));
cout << a << ", " << b << endl;
return 0;
}
没有解释的线路
pint=(int*)data;
和
pchar=(char*)data;
手段。我理解其余部分的含义,但对我来说(char*(数据的含义并不完全合理。它是否指向char的值?但是,如果char是一个变量类型,那怎么可能呢?
行pint = (int*)data
正在做两件事
(int*)data
是从void*
到int*
的转换pint = ...
是对pint
赋值
这个函数最终要做的是将data
指向的值增加一个值。虽然它有点缺陷,因为a(签名接受任何指针类型,但实现只适用于固定的类型集,b(它错误地将大小与类型相关联。
考虑到这是C++,写这篇文章的更好方法是使用模板。它接受所有支持++
的输入类型。
template <class T>
void increase(T* pValue) {
++(*pValue);
}
理想情况下,尽管你只需要使用一个参考
template <class T>
void increase(T& value) {
++value;
}
(int*)data;
和
(char*)data;
是从一种指针类型强制转换到另一种,在这种情况下是从void*
强制转换到int*
和char*
。然后将结果分配给pint
和pchar
数据作为空*传递
(int*(数据正在将其强制转换为int*。
pint=(int*)data;
和
pchar=(char*)data;
将这些变量强制转换为指针,就像将double
强制转换为int
一样,反之亦然。
pchar
是指向char
的指针-这就是声明
char* pchar;
手段。因此,在分配之后
pchar=(char*)data;
指针pchar
指向data
指向的块的开头,当您将pchar
偏移一个数字(比如5-*(pchar+5)
(时,它将指向一个距离data
指向的位置"五个字符"的内存位置。由于char
是一个字节长,这意味着您将位置递增5。由于pint
已被声明为int* pint
,因此相同的构造*(pint+5)
将指向5*sizeof(int)
之外的位置。。。因此+5
的含义不同,这取决于指针的声明方式!
换句话说,声明告诉编译器如何处理指针指向的对象,以及偏移指针时要做什么(增量、减量等(。
指针不像其他指针那样是可变的。它不具有常规值。它所做的只是通过保存地址来记住记忆中的某个位置。
在内存的任何位置都可以启动任何类型的变量。通过将指针强制转换为其他类型(例如(char*)
(,您可以让程序知道,他应该像处理给定类型的变量一样处理内存中的那个位置。
指针指向内存中的某个位置(在32位系统中,所有指针的宽度为32位,64位系统为64位(。当您编写void* pointer
时,您告诉编译器内存中的数据没有类型,因此编译器采用默认宽度来读取内容(例如8bit(。请记住,指针本身总是32/64位,但它指向的数据不同。
例如,当您说char*指针时,它知道数据是一个字符,并为它读取2字节(32位(。int*和其他类型也是如此。或者对于长指针,它读取4字节。
当你写pchar = (char*)data
时,你是在告诉CPU(实际上是MMU(存储在pchar地址的数据是一个字符,因此当我说读取时,为我读取2字节。当你说(短*(时,你告诉MMU为你读取该指针的1字节。
如果你使用void*,系统将使用它的默认大小,我认为是1字节。
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 没有显式声明的int[]中的foreach
- 在c++中访问int到类对象的映射时出错
- 为什么我无法更改"set<set>"循环中的值<int>
- 长 长 int 不要 长 int 好
- C++程序在循环后给出奇怪的int值
- 如何计算数据类型的范围,例如int
- 如果"new int"返回"int*",那么为什么"new int[n]"不返回"int**"?
- int*pint是什么;pint=(int*)数据;意思是