-1

我正在阅读指针如何在这里工作,因为我试图理解 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*)data 可能意味着什么很有意义。它指向char的值吗?但是,如果 char 是变量类型,那怎么可能呢?

4

7 回答 7

8

这条线pint = (int*)data正在做两件事

  1. (int*)data是从void*到的转换int*
  2. pint = ...赋值给pint

最终,这个函数试图做的是将所指向的值增加data一个值。虽然它有点缺陷,因为a)签名接受任何指针类型,但实现只适用于一组固定的类型,b)它错误地将大小与类型相关联。

鉴于这是 C++,更好的编写方法是使用模板。它接受所有支持的输入类型++

template <class T>
void increase(T* pValue) {
  ++(*pValue);
}

理想情况下,尽管您只使用参考

template <class T>
void increase(T& value) {
  ++value;
}
于 2013-04-02T20:51:15.657 回答
2
(int*)data;

(char*)data;

是从一种指针类型到另一种类型的转换,在这种情况下是从void* toint*char*. 然后将结果分配给pintpchar

于 2013-04-02T20:50:51.757 回答
2

数据作为 void* 传递

(int*)data 将其转换为 int*。

于 2013-04-02T20:52:08.223 回答
1
pint=(int*)data;

pchar=(char*)data;

将这些变量转换为指针,就像您将 aadouble转换为 an一样int,反之亦然。

于 2013-04-02T20:50:49.610 回答
1

pchar是指向 a 的指针char- 这就是声明

char* pchar;

方法。因此,分配后

pchar=(char*)data;

指针指向pchar- 所指向的块的开始,data当你偏移pchar一个数字(比如 5 - *(pchar+5))时,它将指向一个内存位置,该位置距离 所指向的位置“五个字符” data。由于 achar是一个字节长,这意味着您将位置增加 5。由于pint已被声明为int* pint,相同的构造*(pint+5)将指向一个5*sizeof(int)远离的位置......所以+5根据指针的声明方式,这意味着不同的事情!

换句话说 - 声明告诉编译器如何处理指针指向的对象,以及当您偏移指针时要做什么(递增、递减等)。

于 2013-04-02T20:55:50.667 回答
0

指针不可变。它不具有常规价值。它所做的只是通过保存地址来记住内存中的某个位置。

在内存中的任何地方都可以启动任何类型的任何变量。通过将指针转换为其他类型,而不是为它创建的类型((char*)例如),您可以让程序知道,他应该使用内存中的那个位置,就好像它是给定类型的变量一样。

于 2013-04-02T21:00:52.130 回答
0

指针指向内存中的一个位置(在 32 位系统中,所有指针的宽度为 32 位,而 64 位系统为 64 位)。当您编写时,void* pointer您是在告诉编译器内存中的数据没有类型,因此编译器采用默认宽度来读取内容(例如 8 位)。请记住,指针本身始终是 32/64 位的,但它指向的数据不同。

例如,当您说 char* 指针时,它知道数据是一个字符,并为它读取 2 个字节(32 位)。int* 等也是一样。或者对于 long* 指针,它读取 4 个字节。

当你写pchar = (char*)data你告诉CPU(实际上是MMU)存储在pchar地址的数据是一个字符,因此当我说读它时,为我读2字节。当您说(短*)时,您是在告诉 MMU 为该指针读取 1 个字节。

如果您使用 void*,系统将使用它的默认大小,我认为是 1 字节。

于 2013-04-02T21:10:51.403 回答