指针运算:char指针作为结构的成员

时间:2017-02-02 18:08:18

标签: c pointers struct

我从K&amp; R(第133页)中提取了一个示例structure,并在pointerpointer array structure上尝试了一些#include <stdio.h> // struct example from K&R struct key { char *word; int count; }keytab[] = { "auto",0, "break",0, "const",0, /*.....*/ "case",0 }; int main () { struct key *ptr1 = keytab; printf("%d\n",sizeof(struct key)); //check1 printf("%s\n",ptr1++->word); //1 printf("%s\n",ptr1->word); //2 //check2 printf("%s\n",++ptr1->word); //3 printf("%s\n",++ptr1->word); //4 //check3 printf("%s\n",ptr1++->word); //5 printf("%s\n",ptr1->word); //6 ?? } 算术}。

8
auto
break
reak
eak
eak
const

输出:

3rd

我可以在运算符优先级的帮助下理解4thprintf 5th的输出。

但是当涉及6thprintf ptr1时,1st & 2nd如何在这里增加?该程序的输出显示与printf ptr1 s类似的行为。如果8以一个结构大小(此处为keytab[2]个字节)的步长递增,那么它如何将自身与while的开头对齐。

我可能已经理解错误或者最后一个查询可能无效,请解释一下!

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

因此,3和4打印增加ptr1-> word。执行完毕后,ptr1-> word指向&#34; eak&#34;。

打印5首先打印未修改的值,然后递增ptr1,然后指向列表中的下一个单词,&#34; const&#34;。

这一切都与操作符优先级有关,正如您所说,但也有关于前缀和后缀++运算符的影响。这些的副作用是相同的,但第一个返回新值,而第二个返回旧值。

答案 1 :(得分:1)

这个表达式:

++ptr1->word

不会增加ptr1指针。由于operator precedence将其归为++(ptr1->word),因为->运算符的绑定比前缀++更紧密。这意味着它会增加结构当前指向对象的word成员。

答案 2 :(得分:1)

  

如果ptr1以一个结构大小(此处为8个字节)的步长递增,那么它如何将自身与keytab [2]的起始对齐。

但是ptr1 总是指向keytab的元素。它不允许指向一个元素的中途,并且永远不会发生。

您看到reak,然后是eak的原因是 ptr1指向的密钥表条目已就地更改。

也就是说,++ptr1->word根本不会更改ptr1 。您可以检查 - 只需在之前和之后打印其值。该表达式会更改中<{1}} 的值。在第3行之后,word已更改(已增加),因此它指向keytab[1].word

当您最终再次增加"reak"时(在打印#5之后),您仍然会将其从ptr1增加到&keytab[1]。您修改&keytab[2]内部的事实根本不会影响到这一点。

  

我可以在运算符优先级

的帮助下理解第3和第4版printf的输出

您似乎正确地意识到了这一点,但忽略了改变keytab[1]并不会影响ptr1->word本身的价值。