C语言难点二:结构体指针引用char *变量中*++p->pk与*p++->pk解析

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;
} 
  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值