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

What does int* pint; pint = (int*)data; mean?

本文关键字:int pint 数据 意思是 是什么      更新时间:2023-10-16

我正在阅读指针在这里是如何工作的,因为我正在努力理解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正在做两件事

  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;
}
(int*)data;

(char*)data;

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

数据作为空*传递

(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字节。