【问题标题】:C * operator meaning in array assignmentC * 运算符在数组赋值中的含义
【发布时间】:2010-12-26 01:54:24
【问题描述】:

这条线是什么意思?几年没学过C了。它是否在括号中执行操作然后使 int 结果成为指针?

b[0] = *(start + pos++);

【问题讨论】:

    标签: c arrays pointers variable-assignment


    【解决方案1】:

    注意这些表达式的等价性。首先,假设以下声明建立了正在运行的类型:

    T* const base;
    size_t const pos;
    

    现在,T 类型的对象位于内存中的位置

    base + sizeof(T) * pos
    

    可以通过多种方式访问​​:

    base[pos]                            // Interpret base as an array.
    *(base + pos)                        // Pointer arithmetic strides by sizeof(T)
    *(T*)((char*)base + sizeof(T) * pos) // Compute stride manually
    

    【讨论】:

    • 你的最后一行不正确,它应该是:*(T *)((char*)base + sizeof(T) * pos) 否则你只会得到你元素的第一个char。
    • 你是对的。我更习惯用 C++ 编写这个,使用reinterpret_cast,我在这里搞砸了。我在编写了一个示例程序后更正了第三个示例,以确认编译器对我的第一次通过不满意并且对修订感到满意。
    【解决方案2】:

    运算符'*'返回该运算符后面的指针或表达式所指向的位置的值。

    一些例子:

    value = *pointer;
    value = *(pointer);     // Exactly the same as the first statement.
    value = *(pointer + 0); // Take contents of pointer and add zero then dereference.
    value = *(pointer + 1); // Deference the first location after the location in pointer.
    

    有时,尤其是在嵌入式系统中,这比使用数组表示法更具可读性。示例:status = *(UART + STATUS_REGISTER_OFFSET);

    【讨论】:

    • +1 举例说明此语法为何有用(假设使用适当命名的变量)
    【解决方案3】:

    为此,start 或 pos 必须是指针;最有可能的是start。然后代码可以写成

    b[0] = start[pos];
    pos = pos + 1;
    

    实际上,即使 pos 是指针,代码也是等价的,因为 C 的数组订阅语义有点滑稽。

    【讨论】:

      【解决方案4】:

      假设 start 是指针,pos 是整数,它可以很容易地改写为:

      b[0] = start[pos++];
      

      希望这能帮助你理解。

      【讨论】:

        【解决方案5】:

        显然start是一个指针(或数组,反正这里会衰减为指针),也就是说()中的表达式的结果是一个指针,而不是int。 * 只是取消引用该指针。

        整个内容等同于普通的b[0] = start[pos++],但出于某种原因,有些人更喜欢使用您帖子中的混淆形式。

        【讨论】:

        • 好的,我支持你,但我对“混淆”评论感到愤怒。如果您只保留三个冗余结构中的两个:p[e]、*p 和 p+e,则保留后两个结构将获得最清晰的程序(但我可能是部分的,在 C 静态分析器上工作它的第一个转换是将程序中的所有p[e] 变成*(p+e) 以限制要研究的构造数量)。
        • 好吧,首先,我不确定您所说的“三个冗余结构”是什么意思,因为它们不等价。其次,至于p[e] vs *(p + e),我想说后者在某些情况下有其应用,但我认为[]形式在大多数情况下更具可读性。
        • 我更喜欢 e[p]。特别是当像 i
        • 糟糕,我想我忘记了 i-10 周围的括号。
        • 除了越界访问之外,即使没有括号也是有效的。取决于您想要实现的目标:)
        猜你喜欢
        • 2014-05-18
        • 2017-01-14
        • 1970-01-01
        • 2021-05-13
        • 1970-01-01
        • 2021-01-24
        • 1970-01-01
        • 2013-04-28
        • 2011-07-29
        相关资源
        最近更新 更多