【问题标题】:Why can we use only four operators (+,-,++,--) in pointer arithmetic? [closed]为什么我们在指针运算中只能使用四个运算符(+、-、++、--)? [关闭]
【发布时间】:2017-02-12 03:52:47
【问题描述】:

为什么我们在指针运算中只能使用四个运算符(+-++--)?既然是处理地址,它与内置硬件有什么关系吗?

由于数组使用相对寻址,因为我们增加地址来执行该操作,我认为这可能是单独使用这 4 个运算符的原因之一。

【问题讨论】:

  • 您认为还有哪些其他运算符有意义?
  • @John3136:公平地说,ptr % 8 这样的东西实际上可能有用。
  • @KeithThompson:如果你知道这行得通,int *p; ... uintptr_t boff = ((uintptr_t)p % 8);p % 8 可能对所有除数的所有架构都没有多大意义(例如,对于像 x86-16 位这样的段:偏移量移植器)。
  • 运营商会怎么做?如果您使用指针进行乘法或除法或其他操作,结果会是什么?
  • @Olaf:我曾在可能会严重失败的系统上工作过。 (Cray 向量机。硬件地址是 64 位,指向一个 64 位字。编译器通过在高 3 位中存储偏移量来合成字节地址。指针和整数之间的转换只是复制了这些位。)如果@ 987654328@ 是由语言定义的(并且有很好的理由不这样做),然后编译器可以生成获得正确答案所需的任何代码。

标签: c linux pointers operators


【解决方案1】:

为什么在指针运算中只能使用四个运算符(+、-、++、--)?

因为语言是这样构建的。最常见的操作是迭代,这可能就是允许使用这些操作符的原因。

至于为什么以这种方式设计 C 语言背后的基本原理,没有太多可找到的。我检查了 C99 关于指针算术的基本原理,但它主要关注指针算术溢出的结果,并没有提及为什么/何时指针算术有意义。

既然是处理地址,它与内置硬件有什么关系吗?

不,与此无关。地址只是数字。您始终可以将任何指针转换为uintptr_t,然后将其用作任何其他整数。

【讨论】:

  • 地址不仅仅是数字。它们可能在硬件中以这种方式实现,但 C 指针值是指针值;指针不是算术类型。至于理由,对我来说似乎很清楚;这些是唯一有意义的操作。
  • 对于uintptr_t,只能保证从指针转换到相同类型。还保证它是一个(无符号)整数类型,因此它也可以存储一个整数值。但是,如果您更改存储的指针值并将其转换回来,则标准没有定义任何内容。这是 - 严格来说 - 未定义的行为。
  • @KeithThompson 有很多运算符可以用于地址。 & | ~ 操作或屏蔽位。 % 检查指针是否对齐。等等。但是由于类型系统要求这些运算符具有整数操作数,所以不能使用指针类型。他们通过这个限制实现的唯一一件事就是降低 C 的用处。
  • @KeithThompson 同样,指针不是数字的任何假设都会使 C 的用处降低,因为现实世界中 99.9% 的现有计算机中,指针都是数字。不幸的是,C 标准与现实不同步,因为 C 标准努力赋予非正统、自古以来或完全虚构的计算机与主流生产相同的地位,即地址为 0 及以上数字的二进制补码计算机。跨度>
  • @Olaf:不仅如此,与uintptr_t 的转换仅针对void* 定义。
【解决方案2】:

您可以使用任何运算符,只要结果是 int 即可。例如:

int A[10], i=5;
int *p;
p = A + (i/2);

【讨论】:

  • (1/2) 就是0。您没有显示指针除法,您只是将0 添加到指针。
  • @Keith-Thompson, 1/2??我写了i/2,将i初始化为5,给出2,因此&A[2]
  • 我的错,我看错了。但我的观点是站得住脚的。 (i/2) 仍然只是一个整数表达式,您所做的只是将一个整数添加到一个指针中——结果不是 int,这与您的第一句话相矛盾。问题不是关于整数的算术运算,而是关于指针的算术运算。
【解决方案3】:

简单,因为 C 就是这样设计的。

+,- 可以简单地分别用于添加或减去两个指针(仅地址处的值)。而另一方面,递增和递减运算符,即 ++ 和 -- 可用于递增或递减指针。请记住,指针的数据类型在这两个 (++,--) 运算符中起着重要作用。

例如,如果你定义了一个 *int 类型的指针,那么 ++ 会将内存地址增加 2(因为 int 在大多数编译器中的大小是 2 ),所以 -- 运算符也是如此,因为它会减少它2.

【讨论】:

  • + 不能用于添加两个指针。您可以将指针添加到整数,或将整数添加到指针。添加两个指针没有意义。此外,减去两个指针会产生一个整数,而不是指针。而且指针的类型也会影响+-的行为。
  • 我想说指针变量可用于在该地址添加值...像 *p + *q 可以添加,这意味着地址 p 和 q 的值可以通过+
  • 这与问题无关。 *p + *q 不是指针加法;它只是整数加法(假设pq 是指向整数的指针);同样,*p / *q 不是指针除法。
  • 在问题中,有人问为什么可以使用 +,我只是说可以在地址处使用 + 值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
  • 2020-07-30
  • 2021-10-17
相关资源
最近更新 更多