我从K& R(第133页)中提取了一个示例structure
,并在pointer
上pointer
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
我可以在运算符优先级的帮助下理解4th
和printf
5th
的输出。
但是当涉及6th
和printf
ptr1
时,1st & 2nd
如何在这里增加?该程序的输出显示与printf
ptr1
s类似的行为。如果8
以一个结构大小(此处为keytab[2]
个字节)的步长递增,那么它如何将自身与while
的开头对齐。
我可能已经理解错误或者最后一个查询可能无效,请解释一下!
感谢您的帮助!
答案 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
。您可以检查 - 只需在之前和之后打印其值。该表达式会更改word
已更改(已增加),因此它指向keytab[1].word
。
当您最终再次增加"reak"
时(在打印#5之后),您仍然会将其从ptr1
增加到&keytab[1]
。您修改&keytab[2]
内部的事实根本不会影响到这一点。
我可以在运算符优先级
的帮助下理解第3和第4版printf的输出
您似乎正确地意识到了这一点,但忽略了改变keytab[1]
并不会影响ptr1->word
本身的价值。