【问题标题】:Why do C/C++ pointers need to have a type if they are "just" addresses? [duplicate]如果 C/C++ 指针“只是”地址,为什么它们需要有一个类型? [复制]
【发布时间】:2019-03-14 08:44:18
【问题描述】:

我无法理解指针需要“类型说明符”的原因。在我看来,它们只是指针,因此它们的类型可能就像“ptr”,在 32 位机器中,我希望它们每个内存占用四个字节,无论它们指向什么。

当我需要检索特定变量(int 或 double 等)时,编译器会根据某个变量的类型知道它应该检索“多少”字节才能获得整体。我可能我错过了一些逻辑,并感谢您的意见。

例子:

#include "pch.h"
#include <iostream>

int main()
{
    ptr *value; // Why is this ILLEGAL?
    int test = 15;
    value = &test;

    std::cout << *value;
}

【问题讨论】:

  • 那么您的模型中的++value 是什么?下一个int?下一个字节?
  • 请注意,如果允许,相同类型的指针将被允许指向一个 int 和一个 vector&lt;double&gt;
  • @StoryTeller:感谢您的回复。嗯......现在我明白你的意思了。如果 value 是 int *value,则 value++ 将是 4 字节“向前”,如果是 double,则将是 8 字节向前。由于我没有考虑指针操作,所以我无法理解原因......现在我想我知道了。
  • 也是语法的东西。 IIRC Rust 允许指针/引用的“声明”没有特定类型,并且在将其分配给某物时会推断出该类型。但是它不能被重新分配给不同类型的东西。所以指针/引用有一个类型,但你没有在声明时指定它。

标签: c++ c


【解决方案1】:

能够说出你内心的期望。它指向内存的类型化部分。

否则对指针(而不是地址本身)的所有操作将只是盲目地跟随线索。

【讨论】:

    【解决方案2】:

    C 和 C++ 标准都没有规定不同指针的sizeof 必须相同。

    这是为了让 C 语言能够最大限度地发挥其普遍性。例如,一个架构可能有一个脱离 CPU 的浮点处理器,所以 sizeof(double*) 可能与 sizeof(char*) 不同。

    在指针中包含类型信息对于在 C 和 C++ 中工作的指针算术也是必要的(指针算术本质上是编译时可评估的,因此语言不能求助于运行时类型信息)。 C++ 的static_cast 类似地在编译时可评估。

    因此类型确实很重要,所以ptr *value; 只有在ptr 是一个类型时才有意义。

    【讨论】:

    • 这种暗示只要sizeof相同,指针可以指向不同类型的东西。
    • @chqrlie:公平地说,评论更多地指的是缺少第 3 段的答案版本。
    • 确实,OP 注释中的sizeof 是指向的对象,而不是指针本身......我的困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 2022-07-22
    • 2012-06-02
    • 2013-06-05
    • 2022-01-01
    • 2023-04-02
    相关资源
    最近更新 更多