C数组和指针:指向数组元素的等效指针

时间:2014-02-25 11:26:35

标签: c arrays pointers

编辑:之前提出的类似问题没有解决与该问题相关的一些观点。

在Kernighan和Ritchie的ANSI C书中,他们说以下是等价的

  • a[i]
  • *(a+i)

我不知道如何占用多个地址空间的元素,例如:结构

请解释一下?编辑:谢谢你的所有答案,但我不太明白。看起来我和@CucumisSativus的答案和评论都有同样的困惑。

假设sizeof(* a)是3.如果由于某种原因我想访问a中第一个元素的中间字节,我原以为这就是我要做的:*(a+1)

假设a的地址是10,每个元素的大小是20.并且说我们想要获得指向第二个元素的指针。在我看来,我们可以这样做:p =(10 + 20)。我认为这相当于&a[1]

我真的很难解释我不明白的事情!!

5 个答案:

答案 0 :(得分:6)

指针运算的处理方式与C中的常规整数运算不同。将整数i添加到指针p会使内存地址增加i * sizeof(*p),即i乘以指向的类型的大小。

作为一个潜在有趣但实际上无用的旁注:由于p[i]定义为*(p+i),表达式i[p]也等同于...... {/ p>

答案 1 :(得分:3)

+运算符并不意味着地址空间中的下一个元素

增量由所涉及的数据类型的大小定义。因此,如果a + 1是指向整数的指针,int将引用下一个a,如果struct是指针,则a将引用下一个struct到{{1}}。

答案 2 :(得分:1)

假设我们有一个Integer指针和一个Character指针,如下所示

int * a; char * b;

现在假设a存储在10000位置 和b存储在位置20000

通过执行以下操作

*(a+1) : It will return the value contained in address 10004 i.e. (10000+4)
*(b+1) : It will return the value contained in address 20001 i.e. (20000+1)

原因:

指针添加与常规算术添加不同。如果将1添加到整数指针,则会将指针按整数的大小前进到某个位置。因此,在这种情况下,它将指针前进到10004.由于字符只有1个字节长,所以它将指针前进1个字节。

答案 3 :(得分:0)

a + i在伪代码

中被翻译成类似的东西
  *(a+i*sizeof(variableType))

答案 4 :(得分:0)

我阅读了更多关于K& R的内容,发现了这个难题的缺失部分,让我能够理解正在发生的事情。 (无论我是否正确,都可以辩论!)

从我收集的内容来看,以下内容无效:

p = (10 + 20)
  • 鉴于此,引用:“指针和整数不可互换。零是唯一的例外。”
  • 我认为这意味着*(a + i)执行直接整数运算。
  • 我相信此行为取决于表达式中是否存在指针。

再次引用K& R,并提供给我的问题的其他答案,算术算法的确切行为包括:

  1. 一个指针
  2. 一个或多个整数
  3. (p + n)的

    定义如下:“ n根据p指向的对象的大小进行缩放,这由p 的声明确定。”

    我意识到是什么原因导致我如此困惑:我过去能够使用printf()输出指针的实际地址值。我相信这是“未定义的行为”,我正在使用的编译器通过将指针视为整数来处理。

    同样,鉴于上面两个编号的项目符号点以及使用它们的定义,我认为将两个指针(相同类型)添加在一起会导致未定义的行为,更确切地说,添加两个不同类型的指针。 / p>

    要获取整数的第n个字节,请参阅this question

    K& R后来补充说以下是合法的指针操作:

    • 将一个指针指向另一个指针(相同类型)
    • 添加或减去指针和整数
    • 从另一个指针(到同一个数组)中减去一个指针
    • 比较指针(指向同一个数组)
    • 分配/比较0

    所有其他指针算法都是非法的。