1

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

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

5 回答 5

8

显然start是一个指针(或一个数组,无论如何这里都会衰减为一个指针),这意味着表达式 in 的结果()是一个指针,而不是一个int. 简单地取消引用该*指针。

整个事情相当于 plain b[0] = start[pos++],但出于某种原因,有些人更喜欢使用你帖子中的混淆形式。

于 2009-12-12T22:35:48.963 回答
5

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

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

希望这可以帮助您理解。

于 2009-12-12T22:36:30.740 回答
3

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

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

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

于 2009-12-12T22:36:47.183 回答
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);

于 2009-12-12T22:50:55.570 回答
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
于 2009-12-12T23:11:11.507 回答