【问题标题】:Why do we need different datatype for pointer?为什么我们需要不同的指针数据类型?
【发布时间】:2013-10-18 00:05:50
【问题描述】:
  1. 基本上指针是一个用于存储内存地址的变量,它总是
    十六进制(内存地址) 那为什么我们需要不同的数据类型来存储地址。
  2. EX:int *a;我们可以用这个 a 来存储浮点地址吗?

【问题讨论】:

标签: c++ c operating-system


【解决方案1】:

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

您也不需要需要不同的数据类型,您可以使用void* 就可以了,但您为什么要这样做?在 C++ 中,这是一种代码味道。

还有类型安全。你知道int* 指向int,这是你的优势。

【讨论】:

  • 指针算术也可以是优势?
【解决方案2】:

两个原因:

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

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

【讨论】:

    【解决方案3】:

    对于初学者,我不知道指针所在的机器 存储为十六进制;我熟悉的每一台机器都用过 内部的二进制表示。 (最后 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 的字段。然而,这样的代码极为罕见,而且 正式涉及未定义的行为,因此您必须验证什么 编译器实际上会这样做,并且可能会关闭某些 优化。

    【讨论】:

      【解决方案4】:

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

      EX:int *a;我们可以用这个 a 来存储浮点地址吗?

      通过 C 类型的不安全特性:是的,但不是直接的,尤其是在最近的编译器和标准中(它们往往更安全)

      【讨论】:

        【解决方案5】:

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

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

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

        这样的一个例子是这样的:考虑一下语句

        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,这两个指针的外观和行为完全相同。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-10-23
          • 2012-04-05
          • 1970-01-01
          • 2013-05-28
          • 2020-12-17
          • 1970-01-01
          • 2012-09-13
          相关资源
          最近更新 更多