澄清指针符号

时间:2015-10-27 23:05:08

标签: c

在查看一些C代码时,我遇到了以下例子。

*(dates +2) I get that this is the 3rd element of the array

*dates +2   2 added to the value of the 1st element.

是否有理由使用此表示法: 日期[2]

日期[2]似乎更清晰。

3 个答案:

答案 0 :(得分:5)

括号完全如您所料,决定了操作的优先级。

*(dates+2)将添加指针dates以创建新指针。指针递增的程度取决于指针指向的数据类型的大小,例如dateschar *类型,因为char是1个字节,dates递增2.但是,如果dates是指向64字节结构的指针,则128将添加到指针。无论哪种方式,我们的想法是,当在指针上执行数学运算时,指针的新值将与另一个有效的数据位对齐(当然,除非您在缓冲区之上或之下运行缓冲区)。指针数学完成后,指针将被解除引用,并返回新指针的值。

如果*dates+2没有指针数学,则返回指针的值并向其添加2。

*(dates+2)更常见的表示法是dates[2]

答案 1 :(得分:3)

*(dates +2)中,2被添加到指针dates,然后在*dates +2中取消引用递增的指针,首先取消引用指针dates然后2被添加到解除引用的值中。

        +-------+-------+-------+-------+
        |       |       |       |       |
dates   |  2    |   5   |   6   |   10  |
        +-------+-------+-------+-------+
          x100     x104    x108   x10C

在上面的表达式中,dates将转换为指向第一个元素的指针,即dates[0]数组的datesdates[0]的地址为x100。因此,
*(dates + 2)表示:将2单位添加到基地址x100,然后将值存储在x108。结果将是6 *dates + 2表示:获取基础广告x100的值,然后将2添加到该值。结果将为2 + 2 = 4

答案 2 :(得分:1)

如果dates是数组,

*(dates + 2)

是数组中的第三个​​值,因为数组索引从零开始。 dates实际上是指向数组中第一个值的指针,向它添加2会将指针移动到第三个位置。您也可以将其写为dates[2]

另一方面,

*dates + 2

比数组中的第一个值大2。这里我们只是获取指针指向的值,并将2添加到该值。您也可以将其写为dates[0] + 2

例如,如果数组中的值为101001000,则*(dates + 2)1000,而*dates + 212