devc++下运行
#include<stdio.h>
struct node{
int len;
char *pk;
}x={2,"right"},*p=&x;
int main(){
//结构体指针用->,结构体变量用.
//以下为两种正确的表达
printf("%d,%s\n",p->len,p->pk); //2,right
printf("%d,%s\n",x.len,x.pk); //2,right
//printf("%d\n",*p->len); [Error] invalid type argument of unary '*' (have 'int')
//printf("%d\n",*x.len); [Error] invalid type argument of unary '*' (have 'int')
printf("%d,%c\n",*p->pk,*p->pk); //114,r
printf("%d,%c\n",*x.pk,*x.pk); //114,r
/*由于len为int型变量其结果不能再取内容了,故*会报错
而pk是指向字符串的指针,*pk代表取字符的值
*/
printf("%d,%c\n",*p++->pk,*p->pk); //114,r
p--;
printf("%s\n",p->pk); //right
/* 分析1:表达式*p++->pk
上述*p++->pk表达式中由于->的优先级最高,*与++优先级相等,自右向左执行
但是由于->左边并非直接是一个变量,而是一个表达式,故看做一个整体,相当于(p++)->pk,故++是执行在指针p上的
p++返回的是指针p再执行p=p+1,故*p++->pk相当于*p->pk,p->pk表示pk字符串的首字符地址,*p->pk表示的是首字符
!!!由于之前执行了p=p+1,将指针p向后移动了一个结构体node的大小,
但是由于这里仅定义了一个结构体变量x,而不是结构体数组,p+1指向的地址是没有意义的,
故要正确的输出x结构体变量对应的内容需要执行下面的p--,执行--p和p=p-1都是可以的
*/
printf("%d,%c\n",*++p->pk,*p->pk); //105,r
printf("%s\n",p->pk); //ight
/*分析2:表达式*++p->pk
上述*++p->pk表达式由于->的优先级最高,*与++优先级相等,自右向左执行
首先执行的是p->pk得到pk字符串的首字符地址,然后执行++(p->pk),相当于先返回(p->pk)+1,即pk字符串第二个字符的地址
*++p->pk相当于*((p->pk)+1),故所对应的是字符i,对应ASCII码为105
然后再执行第二个输出*p->pk此时p->pk指向的还是pk字符串中的第一个字符,因此对应的字符仍然是r
!!!最后再执行(p->pk)=(p->pk)+1,因此下面输出pk字符串的时候结果为ight,因为p->pk指向第二个字符,从第二个字符开始输出字符
*/
printf("%d,%c\n",*x.pk,*x.pk); //105,i
printf("%c,%c\n",*++x.pk,*++x.pk); //h,g
printf("%s\n",x.pk); //ht
/*分析3:
上述结合分析1与分析2,可以很容易理解,
结合printf多个元素输出自增与自减运算理解可知,先执行右边的*++x.pk,正常自增后执行左边的*++x.pk
*++x.pk先执行x.pk得到当前pk指针指向的元素,即第二个元素,在执行++x.pk返回第三个元素的地址,*(x.pk+1)得到第三个元素g
然后执行x.pk=x.pk+1,此时x.pk对应的是第三个元素的地址
再执行左边的*++x.pk,返回第四个元素h,
执行x.pk=x.pk+1,此时x.pk对应的是第四个元素的地址,printf执行完此时pk指向的是第四个元素的地址,因此输出ht字符串
*/
//printf("%d,%c\n",*x++.pk,*x.pk); [Error] no 'operator++(int)' declared for postfix '++' [-fpermissive]
//上述由于结构体变量x并非数组或者指针不存在x=x+1的语法,因此报错
return 0;
}