在查看一些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]似乎更清晰。
答案 0 :(得分:5)
括号完全如您所料,决定了操作的优先级。
*(dates+2)
将添加指针dates
以创建新指针。指针递增的程度取决于指针指向的数据类型的大小,例如dates
是char *
类型,因为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]
数组的dates
。 dates[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
。
例如,如果数组中的值为10
,100
和1000
,则*(dates + 2)
为1000
,而*dates + 2
为12
。