指针算术是否在数组之外使用?

She*_*evy 14 c c++

我认为我对指针算法的语义相当了解,但在处理数组时我只看到过例子.是否有任何其他用途不能通过不透明的手段实现?我相信你可以找到一种巧妙的方法来使用它来访问结构的成员,但我不知道为什么你会打扰.我最感兴趣的是C,但我会用C++标记,因为答案可能也适用于那里.

根据到目前为止收到的答案进行编辑:我知道指针可以在许多非数组上下文中使用.我特别想知道关于指针的算术,例如递增,有所作为等.

Gre*_*ill 10

如果遵循字母的语言标准,那么指针算法在指向数组时定义,而不是在任何其他情况下定义.

指针可以指向数组的任何元素,或者一个步骤过去的数组的末尾.

  • 这样,在遍历数组时,您可以获得有用的终止条件.如果这是不可能的,你必须有特殊情况代码来处理任何地方的空数组的情况(因为它无效指向**).允许"超越结束一步"让您指向空数组的结尾. (4认同)
  • [C99标准]的第6.5.6.8节(http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf):"如果指针操作数和结果都指向元素对于相同的数组对象,或者超过数组对象的最后一个元素,评估不应产生溢出;否则,行为是未定义的." (3认同)

R..*_*R.. 10

C中定义的指针算法仅在数组上发生.但是,由于每个对象都有一个由重叠数组组成的表示unsigned char [sizeof object],因此对该表示执行指针算法也是有效的.例如:

struct foo {
    int a, b, c;
} bar;

/* Equivalent to: bar.c = 1; */
*(int *)((unsigned char *)&bar + offsetof(struct foo, c)) = 1;
Run Code Online (Sandbox Code Playgroud)

实际上char *也可以.

  • 即使使用不透明的结构类型,库也可以提供一个函数来返回特定成员的偏移量,然后您可以使用返回的偏移量通过此方法访问它.请注意,这将允许更改结构的布局,而不会使用(我假设它是共享的)库来破坏现有的二进制文件. (2认同)

orl*_*rlp 9

从我的头脑中我知道它在XOR链接列表中使用(非常漂亮)并且我已经看到它用于非常hacky递归.

另一方面,很难找到用途,因为根据标准指针arithmic仅在数组范围内定义.


mpa*_*tel 5

a[n]是"只是"语法糖*(a + n).对于lulz,请尝试以下操作

int a[2];
0[a] = 10;
1[a] = 20;
Run Code Online (Sandbox Code Playgroud)

因此有人可能认为索引和指针算法只是可互换的语法.

  • -1,这完全不相关,问题是关于指针算术的其他用法而不是数组. (2认同)