我在向自己解释以下 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
?
最佳答案
如果 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/