[英]pointer arithmetic : char pointer as a member of a struct
我从K&R(第133页)中获取了一个示例structure
,并在pointer
structure
array
的pointer
上尝试了一些pointer
运算。
#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
以一个结构大小(此处为8
个字节)的步长递增,那么它将如何与keytab[2]
的开始对齐。
我可能理解错了,或者这最后一个查询可能无效,请解释!
谢谢您的帮助!
因此,第3和第4个打印将递增ptr1-> word。 执行它们后,ptr1-> word指向“ eak”。
Print 5首先打印该未修改的值,然后递增ptr1,然后指向列表中的下一个单词“ const”。
正如您所说,所有这些都与运算符优先级有关,而且还与前缀和后缀++运算符的作用有关。 它们的副作用是相同的,但是第一个返回新值,而第二个返回旧值。
该表达式:
++ptr1->word
不增加ptr1
指针。 由于运算符的优先级,它被归类为++(ptr1->word)
,因为->
运算符的绑定比前缀++
更紧密。 这意味着它会增加结构当前指向的对象的word
成员。
如果ptr1以一个结构大小(此处为8个字节)的步长递增,那么它将如何与keytab [2]的开始对齐。
但是ptr1
始终指向keytab的元素。 不允许指向某个元素的中途,这种情况永远不会发生。
您看到reak
,然后看到eak
的原因是, ptr1
指向的keytab条目已就地更改。
也就是说, ++ptr1->word
不改ptr1
可言 。 您可以检查-只需在其前后打印其值即可。 这表情变化的价值word
的密钥表内 。 在第3行之后, keytab[1].word
已更改(已增加),因此指向"reak"
。
当最终再次增加ptr1
时(在打印#5之后),您仍在将其从&keytab[1]
&keytab[2]
到&keytab[2]
。 您修改keytab[1]
内部的事实完全不会影响。
我可以借助运算符优先级来理解第三和第四printf的输出
看来您正确地理解了其中的大部分内容,但是忽略了更改ptr1->word
不会影响ptr1
本身的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.