c - 无法理解从结构地址到 (uint *) 的指针转换

标签 c pointers casting

我在向自己解释以下 C 代码时遇到了一些麻烦,似乎没有人能给我一个明确的答案,所以这实际上是我最后的手段。

struct s some_buffer;

uint *RxPtr;

RxPtr = (uint *)&some_buffer;

我知道类型转换是强制 RxPtr 的唯一方法指向some_buffer因为some_buffer类型为structRxPtr只能指向uint 。给我带来这么多麻烦的是*(uint *) 。我不明白为什么这段代码的作者想要 some_buffer类型为uint *而不仅仅是uint .

我只发现另外 1 个人问过此类问题。适用于我的问题的答案是 &some_buffer给你一个(struct *)需要将其类型转换为 (uint *)

当我这样想时,这是有道理的。但这本质上是说& =struct *&不是指针,那么 &some_buffer 是如何实现的?给我一个(struct *) ?正如我之前所说,为什么这段代码的作者想要 some_buffer类型为uint *而不仅仅是uint

最佳答案

如果 RxPtr 是一个无符号整型,它就不是一个指针。

有人让指向值的指针指向结构体的地址的原因通常是为了能够填充结构体而不关心结构体元素。

假设 struct some_buffer 类似于:

struct some_buffer
{
 uint header;
 uint first_data;
 uint second_data;
};

rx_data 是一个由三个 uint 组成的数组。

然后你可以用以下方式填充some_buffer的数据:

some_buffer.head = rx_data[0];
some_buffer.first_data = rx_data[1];
some_buffer.second_data = rx_data[2];

您也可以将 uint 指针指向该结构并写入:

ptr = (uint *) &some_buffer;
ptr[0] = rx_data[0];
ptr[1] = rx_data[1];
ptr[2] = rx_data[2];

当你做到这一点时,你甚至可以进一步简化它并编写:

ptr = (uint *) &some_buffer;
for(int i = 0; i < 3; i++)
{
   ptr[i] = rx_data[i];
}

由于结构中的每个元素都是 sizeof(uint),并且指针在指向 uint 时也会按 sizeof(uint) 递增,因此您可以填充结构的三个元素,而实际上不需要知道结构元素的名称。即使您将 header 重命名为 mynewheader,指针代码也将起作用。

如果 RxPtr 是无符号整数,则无法执行此操作。递增一个 unsigned int 只会导致该 unsigned int 具有不同的值,但不会指向 some_buffer 的不同内容。

关于c - 无法理解从结构地址到 (uint *) 的指针转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32105008/

相关文章:

C char** 得到结果

c - 表达式和参数的执行顺序是怎样的?

c++ - 用于处理编译错误的 C/C++ 预处理器指令

c - 使用 realloc 扩展和收缩数组

java - 将 Map<String, String> 传递给需要 Map<String, Object> 的方法

c - 如何在 C 中存储结构指针以便数据不丢失?

c - 通过引用传递空数组并在函数内初始化它

c++ - 调整 char 数组的大小并不总是有效

c++ - 通过 C++ 中的标准迭代器将基类转换为派生类

java - 自动将字符串转换为动态确定的类型?