【问题标题】:Pointers and data types指针和数据类型
【发布时间】:2018-12-28 14:25:13
【问题描述】:

我有以下问题。

既然指针保存的是内存地址的值,为什么允许加一个整数 数据类型值指向指针变量但不是双精度数据类型?

我的想法:是因为我们假设指针也是一个 int,还是因为如果我们添加一个 double 会增加它的长度?

感谢您的宝贵时间。

【问题讨论】:

  • ptr+1.1 是什么意思?您无法寻址子字节。如果要向指针添加双精度,始终可以通过先将其转换为整数来实现。诚然,语言可以为你做演员,但它选择不做。
  • 如果你有const char* text = "abc",那么*(text+1) == 'b',但你期望*(text+ 1.5) 是什么角色?
  • 向指针添加整数称为指针算法,是所有数组索引的基础。例如,对于任何数组或指针a和索引i,表达式a[i]完全等于*(a + i)。现在,如前所述,将分数添加到指针意味着什么?您无法寻址存储单元的位或部分。
  • 我认为问题是向指针添加例如 long 或 long long,假设 long/long long 有 64 位,而 int 有 32 位,而不是 float/double
  • 您可以将一个整数添加到您的家庭地址并获取其他人的地址,但不是 1.3。这不奇怪吗?

标签: c++ pointers


【解决方案1】:

您几乎自己回答了您的问题:指针是内存地址。内存地址是一个整数。您可以将整数添加到整数并获得整数作为结果。将浮点数添加到整数会得到一个浮点数,它不能用作内存地址。

例如char *x = 0;是单个字节的地址; char *y = 0.5; 是什么意思?一个字节,它以某种方式由地址 0 处的字节的后半部分和地址 1 处的字节的前半部分组成?这可能是有道理的,但是char *x = 3.1415926; 或任何类似的浮点数呢??

【讨论】:

  • “不能用作内存地址”我认为“不能”在这里不是一个正确的术语。没有意义所以没有定义。
  • @Slava,我认为两者兼而有之:没有意义,一个物理上无法寻址部分字节。
  • 如果数组元素都是 4 个字节,那么向指针添加 0.25 可以访问特定字节,但是语言选择不幽默。
【解决方案2】:

我的想法:是因为我们假设指针也是一个 int,还是因为如果我们添加一个 double 会增加它的长度?

如果您查看documentation,它会说:

指向数组元素的指针定义了某些加法、减法、增量和减量运算符:此类指针满足 LegacyRandomAccessIterator 要求并允许 C++ 库算法处理原始数组。

(重点是我的)你应该记住:

*(ptr + 1)

等于:

ptr[1]

并且数组的索引是整数,因此语言没有定义对带有浮点操作数的指针的操作,因为这没有任何意义。

【讨论】:

    【解决方案3】:

    您不能通过 C 的约定将 double*(指针)添加到 int*(指针)。指针保存内存地址的值 [“存储/指向另一个变量的地址”] 该值本质上是由它的类型决定的,在这种情况下是 int(如果我记得的话,是 4 字节的内存块)。 double 是一种双精度、64 位浮点数据类型。只是不能从最“硬件”的级别做到这一点。

    【讨论】:

    • "int(4 位内存块,如果我记得的话)" - int 通常是 4 字节
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多