我有以下代码:
unsigned char bytes[12] = { 1, 2, 3, 4,5, 6, 7, 8,9, 10, 11, 12};
char *i;
struct i_and_c {int x;char c;} *p; //What's the meaning of *p? Is it a pointer
//to the struct "i_and_c"???
i = (char *) (&(bytes[4]));
p = (struct i_and_c *) (&(bytes[5]));
我必须写出以下表达式的值:
- 我[2]
- p->c
解决方法是:
- 7
- 10
但我只是不知道我们如何获得这些值。谁能帮帮我吗?谢谢=D
最佳答案
你得到的值明明是来自于bytes数组,但是为什么要得到这些值呢?
unsigned char bytes[12] = { 1, 2, 3, 4,5, 6, 7, 8,9, 10, 11, 12};
这里的 bytes
可以看作是指向数组第一个元素的 unsigned char*
,即 1。现在让我们分解一下这个指针算法,好吗?
首先,让我们将 i
的类型从 char*
更改为 unsigned char*
,因为它确实是这样,或者应该是这样。
unsigned char *i;
i = (unsigned char *) (&(bytes[4]));
括号表示访问第 n 个元素,即第 5 个元素,因为索引从 0 开始。这意味着我们可以将它们重写为简单的加法和解引用。
unsigned char *i;
i = (unsigned char *) (&(*(bytes+4)));
等等,我们真的得到了我们通过取消引用指针获得的值的地址吗?是的,我们有。我们同时应用该运算及其逆运算。这意味着什么?我们可以简单地省略这两个部分!
unsigned char *i;
i = (unsigned char *) (bytes+4);
所以现在 i
是指向 bytes
的第 5 个元素的指针,因为我们从指向第一个元素的指针开始并向其添加 4。现在 i[2]
与 *(i+2)
相同。如果i
是指向第5个元素的指针,i+2
是指向第7个元素的指针,随后i[2]
就是第7个bytes
的元素,恰好是 7。
现在我们已经解决了这个问题,让我们继续下一个问题,不过它稍微有点棘手。让我们更改代码,以便更清楚地了解它的作用。
struct i_and_c {int x;char c;};
struct i_and_c *p;
p = (struct i_and_c *) (&(bytes[5]));
*p
确实是指向 i_and_c
类型的 struct
的指针。让我们以与上述相同的方式对其进行简化。
struct i_and_c {int x;char c;};
struct i_and_c *p;
p = (struct i_and_c *) (bytes+5);
好的,现在我们有一个指向 struct i_and_c
的指针,它从 bytes
数组的第 6 个元素开始。 警告:这是未定义的行为,实际上,在大多数机器上,它的行为将如下一节所述。
该结构由一个 int 后跟一个 char 组成。我假设 sizeof(int) = 4
并且 int
和 char
之间没有填充,这两者都需要为您的给出的结果是正确的。
这意味着结构中的 int
将从字节的第 6 个元素到第 9 个元素(包括它)。 char
会在后面,这意味着它是第 10 个元素。现在 p->c
与 (*p).c
相同,这意味着您想要获取该字符。 bytes
的第 10 个元素是 10,因此这就是您得到的结果。
希望我的解释对您有所帮助:)
关于c - C中的这段代码是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22786360/