【发布时间】:2015-08-19 20:25:27
【问题描述】:
我在向自己解释以下 C 代码时遇到了一些麻烦,似乎没有人能给我一个明确的答案,所以这实际上是我最后的手段。
struct s some_buffer;
uint *RxPtr;
RxPtr = (uint *)&some_buffer;
我知道类型转换是强制RxPtr 指向some_buffer 的唯一方法,因为some_buffer 是struct 类型,而RxPtr 只能指向uint。给我带来这么多麻烦的是(uint *) 中的*。我不明白为什么这段代码的作者希望some_buffer 的类型为uint * 而不仅仅是uint。
我只发现另外 1 个人问过这类问题。应用于我的问题的答案是&some_buffer 为您提供(struct *),需要将其类型转换为(uint *)。
当我这样想时,这是有道理的。但这本质上是在说& = struct *。 & 不是指针,那么&some_buffer 怎么给我一个(struct *)?就像我之前说的,为什么这段代码的作者希望 some_buffer 的类型为 uint * 而不仅仅是 uint?
【问题讨论】:
-
&是“地址”运算符。应用它会产生一个指向操作数的指针。这在您的“C 语言简介”一书的前几章中有介绍。RxPtr是uint*,因为这是周围代码所需要的。 -
XY 问题:序列化结构的正确方法是正确且可移植地序列化其字段。 没有强制转换和警告。
-
你会感到惊讶,moldbnilo。所有介绍 C 的书籍都说明了指针是什么,以及 & 是什么,但没有详细说明 & 产生指向操作数的指针(如果正确的话)。在过去的几天里,我浏览了大约 5 C 本书。不过感谢您的回答,它确实清除了我的一些想法。