繁体   English   中英

为什么我们需要不同的指针数据类型?

[英]Why do we need different datatype for pointer?

  1. 基本上,指针是一个用于存储内存地址的变量,它始终是
    十六进制(内存地址)那么为什么我们需要不同的数据类型来存储地址。
  2. EX:int * a; 我们可以使用它来存储浮动地址。

并非所有指针都是(必须具有)相同的大小。 如果你有一个需要对齐到10 MB的大型结构,编译器可以决定它只需要8位(而不是通常的32位或64位)来存储你的变量所在的所有可能的地址。

你也不需要不同的数据类型,你可以使用void*就好了,但为什么会这样呢? 在C ++中,这是一种代码嗅觉。

还有类型安全。 你知道一个int*指向一个int ,这对你有利。

两个原因:

  1. 在某些体系结构上,指针可能具有不同的格式,具体取决于它们指向的数据大小。 例如,指向char的指针必须能够处理单个字节,但是指向int的指针只需要能够处理4个字节的组。 所以后者可以使用包含字节地址除以4的格式。

  2. 它允许编译器生成正确的程序。 如果您尝试取消引用char指针并将其指定给int ,则需要知道它应该只读取源中的一个字节,并将其扩展为int的大小。 如果没有指针类型声明,它将读取比适当更多的字节。

对于初学者,我不知道指针存储为十六进制的机器; 我熟悉的每台机器都在内部使用二进制表示。 (至少在过去30年或40年.IIRC,IBM 1401到处使用小数。)

正如其他人所指出的,并非所有指针具有相同的大小和表示。 我曾经在char*比其他数据指针类型更大的机器上工作,当然,函数指针和数据指针的大小不同,曾经很常见。

然而,真正的答案是它基于C和C ++中的类型系统。 如果p是指针,那么*p的类型是什么? 如果我写了类似*p + *q东西,编译器必须知道是否使用整数运算或浮点运算。

至于你的第二个问题:通常,是的,虽然你可能需要在某处进行reinterpret_cast 但是,你可以合法地使用你的int*将它转换回float* ; 解除引用它是未定义的行为。

char*unsigned char*有一些例外。 在实践中,如果你知道自己在做什么,就可以逃避:

float f;
int* a = reinterpret_cast<int*>( &f );
std::cout << *a << std::endl;

我实际上做了类似的事情,用于某种低级调试或编程; 比如从float提取指数字段。 但是,这样的代码非常罕见,并且正式涉及未定义的行为,因此您必须验证编译器实际执行的操作,并可能关闭某些优化。

因为它提供了有关如何解释指针指向的数据的信息。

EX:int * a; 我们可以使用它来存储浮动地址。

通过C类型的不安全功能:是的,但不是直接的,特别是在最近的编译器和标准中(往往更安全,更安全)

为什么我们需要不同的数据类型来存储地址

这实际上是正确的问题,答案隐藏在其中 - 为什么我们需要一个不同的数据类型来存储地址。 我们(程序员)需要它。 机器不关心 - 一个数字就像另一个数字。

如果您将“变量”视为某些数据的“占位符”,则在使用数据本身和使用变量之间的编程语言中存在二分法。 有时您只需要数据(例如,您需要将其打印出来),有时您需要存储此数据的地址(例如,您可以对其进行修改)。 大多数语言都有语法糖,这会混淆这两种情况,并在不同的上下文中区别对待变量标识符。

一个这样的情况是这样的:考虑声明

a = 1;

在这种情况下,编译器查找由“a”标识的变量的地址,并将“1”写入该地址。 标识符“a”也可以是指针。 现在看一下另一件事:

if (a == 1) ... ;

没有将“a”标识的变量的地址与某些内容进行比较,而是将此地址中存储的内容与“1”进行比较。

为了方便程序员,各种“指针类型”再次存在:基本上我们通过错误地访问数据来减少错误。 看看这个例子:

double d;
double* dp;
int i;
int* ip;

默认情况下,C对此非常放松,通常可以执行以下操作:

dp = ip;

要么

dp = &i;

......但是! sizeof(i)== 4和sizeof(d)== 8,所以如果你取消引用dp指针你会尝试从只保留4的变量(i)中读取8个字节。这意味着你将读取4个不可预测的在i的前四个字节之后的(随机)字节,这绝对是你不想做的事情。

同样,所有这些都是为了我们的方便。 机器不在乎。 两个指针的外观和行为与CPU完全相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM