什么是int *品脱; pint =(int *)数据;意思?

时间:2013-04-02 20:47:40

标签: c++ pointers

我正在阅读指针是如何工作的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是变量类型,怎么可能呢?

7 个答案:

答案 0 :(得分:8)

pint = (int*)data行正在做两件事

  1. (int*)data是从void*int*
  2. 的转换
  3. pint = ...是对pint
  4. 的值的赋值

    最终,此函数尝试执行的操作是将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*。 之后,结果将分配到pintpchar

答案 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的默认大小。