【问题标题】: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];
      

      请注意,在此表达式中:&amp;(*(timeStamps + i))timeStamps + i 是指向索引 i 处的元素的指针(即该元素的地址),然后使用返回 l 的 dereference operator (*) 取消引用-MyStructure 类型的值,然后使用 address-of 运算符 (&amp;) 检索此元素的地址,该地址等于 timeStamps + i 开头的地址。

      【讨论】:

        【解决方案3】:
        MyStructure *myStructure = &timeStamps[i];
        

        【讨论】:

          【解决方案4】:

          自从我在 C 中工作以来已经有一段时间了,但据我所知,方括号索引运算符 ([]) 与添加到指针相同。所以:

          timeStamps[i] 应该等同于*(timeStamps + i)

          所以你应该可以使用

          myStructure = &amp;timeStamps[i]

          【讨论】:

            【解决方案5】:

            我建议:

            void Process(MyStructure *timeStamps, int arrayLength){
                for (MyStructure *i = timeStamps; i < timeStamps + arrayLength; i++) {
                    if (i->isUsed == true) {
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2023-01-30
              • 1970-01-01
              • 2010-09-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多