C*运算符在数组赋值中的意义

C*运算符在数组赋值中的意义,c,arrays,pointers,variable-assignment,C,Arrays,Pointers,Variable Assignment,这条线是什么意思?我已经好几年没做C了。它是否在parens中执行操作,然后使int结果成为指针 b[0] = *(start + pos++); 显然,start是一个指针(或者一个数组,在这里无论如何都会衰减为指针),这意味着()中表达式的结果是一个指针,而不是int。*只是解除对该指针的引用 整个过程相当于普通的b[0]=start[pos++],但出于某种原因,有些人更喜欢使用您的帖子中的模糊形式。显然start是一个指针(或数组,它在这里无论如何都会衰减为指针),这意味着()中表达式

这条线是什么意思?我已经好几年没做C了。它是否在parens中执行操作,然后使int结果成为指针

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

显然,
start
是一个指针(或者一个数组,在这里无论如何都会衰减为指针),这意味着
()
中表达式的结果是一个指针,而不是
int
*
只是解除对该指针的引用


整个过程相当于普通的
b[0]=start[pos++]
,但出于某种原因,有些人更喜欢使用您的帖子中的模糊形式。

显然
start
是一个指针(或数组,它在这里无论如何都会衰减为指针),这意味着
()
中表达式的结果是一个指针,不是
int
*
只是解除对该指针的引用


整个过程相当于普通的
b[0]=start[pos++]
,但出于某种原因,有些人喜欢使用您的帖子中的模糊形式。

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

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

希望这有助于您理解。

假设start是指针,pos是整数,它可以轻松地重写为:

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

希望这有助于您理解。

若要使其有意义,则
start
pos
必须是指针;很可能是
start
。然后可以将代码编写为

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

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

要使这有意义,无论
start
还是
pos
都必须是指针;很可能是
start
。然后可以将代码编写为

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

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

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

一些例子:

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\u REGISTER\u OFFSET)

运算符“*”返回该运算符后面的指针或表达式指向的位置处的值

一些例子:

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\u REGISTER\u OFFSET)

注意这些表达式的等价性。首先,假设以下声明建立了起作用的类型:

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* 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

好吧,我投票给你,但我对“模糊”的评论很生气。如果您只保留三个冗余结构中的两个:
p[e]
*p
p+e
,则通过保留后两个可以获得最清晰的程序(但我可能是局部的,在C静态分析器上工作,其第一个转换是将程序中的所有
p[e]
转换为
*(p+e)
以限制要研究的结构的数量)。首先,我不确定你所说的“三个冗余结构”是什么意思,因为它们不是等价的。第二,关于
p[e]
vs
*(p+e)
,我认为后者在某些上下文中有其应用,但我认为
[]
形式在大多数情况下更具可读性。我更喜欢e[p]。尤其是当我<10岁时?i[“0123456789”]:i-10[“abcdef”]。哎呀,我想我忘记了i-10周围的括号。除了越界访问之外,即使没有括号也有效。取决于你想要达到的目标:)好吧,我投票给你,但我对“模糊”的评论很生气。如果您只保留三个冗余结构中的两个:
p[e]
*p
p+e
,则通过保留后两个可以获得最清晰的程序(但我可能是局部的,在C静态分析器上工作,其第一个转换是将程序中的所有
p[e]
转换为
*(p+e)
以限制要研究的结构的数量)。首先,我不确定你所说的“三个冗余结构”是什么意思,因为它们不是等价的。第二,关于
p[e]
vs
*(p+e)
,我认为后者在某些上下文中有其应用,但我认为
[]
形式在大多数情况下更具可读性。我更喜欢e[p]。尤其是当我<10岁时?i[“0123456789”]:i-10[“abcdef”]。哎呀,我想我忘记了i-10周围的括号。除了越界访问之外,即使没有括号也有效。取决于您想要实现的目标:)+1对于此语法有用的示例(假设使用了适当命名的变量)+1对于此语法有用的示例(假设使用了适当命名的变量)您的最后一行不正确,它应该是:
*(T*)((char*)base+sizeof(T)*pos
否则您将只获得元素的第一个
字符。您是对的。我更习惯于用C++编写代码,使用<代码> RealTytCase,我在这里吹响了它。在编写示例程序后,我更正了第三个示例,以确认编译器对我的第一次通过不满意,并且对修订版感到满意。您的最后一行不正确,它应该是:
*(T*)((char*)base+sizeof(T)*pos
,否则您将只获得元素的第一个
char
。您是对的。我更习惯于用C++编写代码,使用<代码> RealTytCase,我在这里吹响了它。我批改了第三次考试