【问题标题】:C pointer arithmetic and array accessC 指针算术和数组访问
【发布时间】:2013-03-03 21:29:24
【问题描述】:
我有一个函数,它接受一个指向结构数组的指针
typedef struct {
bool isUsed;
int count;
} MyStructure;
void Process(MyStructure *timeStamps, int arrayLength){
for (int i = 0; i < arrayLength; i++){
MyStructure *myStructure = &(*(timeStamps + i));
if (myStructure->isUsed == true){
/*do something*/
}
}
}
我访问数组的方式似乎有点不对劲。
&(*(timeStamps + i))
有没有更好的方法来做到这一点?
【问题讨论】:
标签:
c
arrays
pointers
pointer-arithmetic
【解决方案1】:
&(*(timeStamps + i))
等价于
&timeStamps[i]
也就是简单
timeStamps + i
就是这样:)
【解决方案2】:
参数timeStamps的类型是MyStructure*,这意味着这一行:
MyStructure *myStructure = &(*(timeStamps + i));
相当于:
MyStructure *myStructure = timeStamps + i;
也相当于:
MyStructure *myStructure = &timeStamps[i];
请注意,在此表达式中:&(*(timeStamps + i)),timeStamps + i 是指向索引 i 处的元素的指针(即该元素的地址),然后使用返回 l 的 dereference operator (*) 取消引用-MyStructure 类型的值,然后使用 address-of 运算符 (&) 检索此元素的地址,该地址等于 timeStamps + i 开头的地址。
【解决方案3】:
MyStructure *myStructure = &timeStamps[i];
【解决方案4】:
自从我在 C 中工作以来已经有一段时间了,但据我所知,方括号索引运算符 ([]) 与添加到指针相同。所以:
timeStamps[i] 应该等同于*(timeStamps + i)
所以你应该可以使用
myStructure = &timeStamps[i]
【解决方案5】:
我建议:
void Process(MyStructure *timeStamps, int arrayLength){
for (MyStructure *i = timeStamps; i < timeStamps + arrayLength; i++) {
if (i->isUsed == true) {