【发布时间】:2010-12-26 01:54:24
【问题描述】:
这条线是什么意思?几年没学过C了。它是否在括号中执行操作然后使 int 结果成为指针?
b[0] = *(start + pos++);
【问题讨论】:
标签: c arrays pointers variable-assignment
这条线是什么意思?几年没学过C了。它是否在括号中执行操作然后使 int 结果成为指针?
b[0] = *(start + pos++);
【问题讨论】:
标签: c arrays pointers variable-assignment
注意这些表达式的等价性。首先,假设以下声明建立了正在运行的类型:
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。
reinterpret_cast,我在这里搞砸了。我在编写了一个示例程序后更正了第三个示例,以确认编译器对我的第一次通过不满意并且对修订感到满意。
运算符'*'返回该运算符后面的指针或表达式所指向的位置的值。
一些例子:
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);
【讨论】:
为此,start 或 pos 必须是指针;最有可能的是start。然后代码可以写成
b[0] = start[pos];
pos = pos + 1;
实际上,即使 pos 是指针,代码也是等价的,因为 C 的数组订阅语义有点滑稽。
【讨论】:
假设 start 是指针,pos 是整数,它可以很容易地改写为:
b[0] = start[pos++];
希望这能帮助你理解。
【讨论】:
显然start是一个指针(或数组,反正这里会衰减为指针),也就是说()中的表达式的结果是一个指针,而不是int。 * 只是取消引用该指针。
整个内容等同于普通的b[0] = start[pos++],但出于某种原因,有些人更喜欢使用您帖子中的混淆形式。
【讨论】:
p[e]、*p 和 p+e,则保留后两个结构将获得最清晰的程序(但我可能是部分的,在 C 静态分析器上工作它的第一个转换是将程序中的所有p[e] 变成*(p+e) 以限制要研究的构造数量)。
p[e] vs *(p + e),我想说后者在某些情况下有其应用,但我认为[]形式在大多数情况下更具可读性。