我正在阅读指针是如何工作的here,因为我正在尝试理解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是变量类型,怎么可能呢?
答案 0 :(得分:8)
第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;
}
答案 1 :(得分:2)
(int*)data;
和
(char*)data;
是从一种指针类型转换为另一种指针类型,在本例中是从void*
到int*
和char*
。
之后,结果将分配到pint
和pchar
答案 2 :(得分:2)
数据作为void *
传递(int *)数据将其转换为int *。
答案 3 :(得分:1)
pint=(int*)data;
和
pchar=(char*)data;
将这些变量作为指针投射,就像将double
投射到int
一样,反之亦然。
答案 4 :(得分:1)
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
表示不同的东西,具体取决于指针的声明方式!
换句话说 - 声明告诉编译器如何处理指针指向的对象,以及在偏移指针时要做什么(增量,减量等)。
答案 5 :(得分:0)
指针不像其他任何变量一样。它不具有常规价值。它所做的只是通过握住它的地址来记住内存中的某个地方。
在内存中的任何位置都可以启动任何类型的任何变量。通过将指针转换为其创建的其他类型(例如(char*)
),您可以让程序知道,他应该在内存中使用该位置,就好像它是给定类型的变量一样。
答案 6 :(得分:0)
指针指向内存中的某个位置(在32位系统中,所有指针的宽度为32位,64位系统为64位)。当您编写void* pointer
时,您告诉编译器内存中的数据没有类型,因此编译器采用默认宽度来读取内容(例如,8位)。请记住,指针本身总是32/64位,但它指向的数据不同。
例如,当你说char *指针时,它知道数据是一个字符,并为它读取2字节(32位)。对于int *和其他人来说也是如此。或者对于long *指针,它读取4byte。
当您写pchar = (char*)data
时,您告诉CPU(实际上是MMU)存储在pchar地址的数据是char,因此当我说读取时,请为我读取2byte。当你说(短*)时,你告诉MMU为你读指针读取1byte。
如果你使用void *,系统将使用我认为是1byte的默认大小。