c - C中的这段代码是什么?

标签 c arrays pointers

我有以下代码:

   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]));

我必须写出以下表达式的值:

  1. 我[2]
  2. p->c

解决方法是:

  1. 7
  2. 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 并且 intchar 之间没有填充,这两者都需要为您的给出的结果是正确的。
这意味着结构中的 int 将从字节的第 6 个元素到第 9 个元素(包括它)。 char 会在后面,这意味着它是第 10 个元素。现在 p->c(*p).c 相同,这意味着您想要获取该字符。 bytes 的第 10 个元素是 10,因此这就是您得到的结果。

希望我的解释对您有所帮助:)

关于c - C中的这段代码是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22786360/

相关文章:

c - Null/void 指针不正确的值

python - 如何将 numpy 数组转换为形式 ((value0, row0, column0), (value1, row0, column1)...)?

c - 了解取消引用未初始化指针的 C 的未优化 asm,导致段错误

c++ - 在 C++ 中是否有可移植的指针关系比较的替代方法?

c - 在 dev c++ 中将 int* 分配给 int[] 无法按预期工作

c - 有没有办法将命令行参数传递给自定义入口点(C/C++)

c - 在字符串中查找字符,然后在该字符之前插入字符

c - srand() — 为什么只调用一次?

javascript - 如何使数组中收集的循环值在循环外部可用以供将来使用

c - "0"在C中的二维字符数组(char * [])中意味着什么