我在工作中遇到一些麻烦向我自己解释以下C代码,似乎没有人给我一个明确的答案,所以这实际上是我的最后一招。
struct s some_buffer;
uint *RxPtr;
RxPtr = (uint *)&some_buffer;
我了解强制转换是迫使RxPtr
指向some_buffer
的唯一方法,因为some_buffer
的类型为struct
且RxPtr
可以只指向uint
。让我这么麻烦的是*
中的(uint *)
。我不明白为什么此代码的作者希望some_buffer
属于uint *
类型,而不仅仅是uint
。
我只找到另外一个人问这类问题。答案适用于我的问题,&some_buffer
会为您提供一个(struct *)
,需要将其输入(uint *)
。
当我这样想时,这是有道理的。但这基本上是在说&
= struct *
。 &
不是指针,&some_buffer
如何给我(struct *)
?就像我之前说过的那样,为什么这段代码的作者希望some_buffer
属于uint *
类型,而不仅仅是uint
?
答案 0 :(得分:1)
如果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)递增,因此您需要填充结构的三个元素,而不需要知道结构元素的名称。即使您将标题重命名为mynewheader,指针代码仍然有效。
如果RxPtr是unsigned int,你就不能这样做。增加unsigned int只会导致unsigned int具有不同的值,但不会指向some_buffer的不同内容。
答案 1 :(得分:0)
some_buffer
是一回事。 &some_buffer
是该内容的地址。现在,地址是内存中的一个位置,任何类型都可以存储在一个地址中。在这种情况下,&amp; some_buffer是结构的地址。
RxPtr
也被声明为地址,旨在存储uint
。原作者可能知道结构以uint
开头,只是强制指针反映出来。但这是不好的做法,这可能会误导你。
答案 2 :(得分:-1)
我只发现另外一个人在问这类问题。答案适用于我的问题,
&some_buffer
会为您提供一个(struct *)
,需要将其输入(uint *)
。
有些日子我想知道抓住指针的一些困难是由于C使用type *
表示地址而不是type &
来混淆水域。如果使用的是&
,那么*
会更加自然地与&
相反。
// wishful thinking
int x;
int &addr = &x;
int y = *addr;
但这不是C所做的。当您使用&x
获取变量的地址时,您会获得type *
。在我第一次学习指针20年后,现在对我来说似乎很自然,但我记得当我年轻的时候,这种语法似乎非常令人困惑。
在我们生活的世界里,C并没有将&x
视为x
&#34;的地址。相反,它是指向x
&#34;的指针,因此结果类型为int *
而不是int &
。
// reality
int x;
int *addr = &x;
int y = *addr;
变量通常被认为包含指针,比地址更多。请注意,地址仍然是正确的。说地址没错。只是这两个词是同义词,&#34;指针&#34;更常见。
(uint &) &some_buffer; // wishful thinking
(uint *) &some_buffer; // reality
这解释了为什么指针强制转换为(uint *)
。 &some_buffer
为您提供指向some_buffer
&#34;的指针。并且(uint *)
将该指针强制转换为另一种类型。