关于结构体指针以及.和->区别的几个尝试

一、指针:

1、指针是否需要分配到空间问题

定义如下结构体以及指针,*change并未指向任何结构体

struct student{
		char name[11],ID[11];
		int score;
	};
	struct student class1[2];
	struct student *tem=class1,*max=tem+1,*min=max+1,*change;

经过赋值比较之后,交换max与tem,change可以正常作为中间变量。

if(tem->score > max->score)
	change=tem,tem=max,max=change;
if(tem->score < min->score)
	change=tem,tem=min,min=change;

总结:交换的只是指针,struct数组内数据并没有影响。

二、. 和->的区别

经查阅知: 箭头(->):左边必须为指针;
     点号(.):左边必须为实体。

附上几个尝试以供理解:(结构体及指针声明同上)

1、->的输入与输出正常:

	scanf("%s %s %d",max->name,max->ID,&max->score);
	printf("%s %s %d",max->name,max->ID,max->core);

2、.的输入正常,由于max指向class1[1],通过max->输出也正常:

	scanf("%s %s %d",class1[1].name,class1[1].ID,&class1[1].score);
	printf("%s %s %d",max->name,max->ID,max->score);

3、.的输入输出正常:

	scanf("%s %s %d",class1[1].name,class1[1].ID,&class1[1].score);
	printf("%s %s %d",class1[1].name,class1[1].ID,class1[1].score);

4、 ->的输入正常,由于max指向class[1],通过class[1].xx输出也正常:

	scanf("%s %s %d",max->name,max->ID,&max->score);
	printf("%s %s %d",class1[1].name,class1[1].ID,class1[1].score);

5、->输入正常,但是对class1[1]取地址然后使用->编译不通过,虽然指针变量存放class1[1]的地址,但是->左边必须是指针,而不能是单纯的地址:

	scanf("%s %s %d",max->name,max->ID,&max->score);
	printf("%s %s %d",&class1[1]->name,&class1[1]->ID,&class1[1]->score);
6、同样,对于指针max并不能解地址然后使用.,这样 编译不通过。可以理解为对max解地址后它依然是个地址:
	scanf("%s %s %d",*max.name,*max.ID,*max.score);
	printf("%s %s %d",class1.name,class1[1].ID,class1[1].score);

1-6总结:
箭头左边必须为指针,点左边必须为实体,但是两者右边并不受其影响,指向的如果是像ID,name数组名,那都是地址。指向score这种int类型的那么输入依然需要用取地址符号&。
输入时其实就是像某一地址写入数据,按照数据类型的内存空间向后推,所以scanf("%s %s %d",max->name,max->ID,&max->score);是可行的。

7、通过指针访问结构体内部某一数组的内部成员:

直接通过max->name+3来访问class1[1].name[3],虽然如下的代码可以通过编译,但是运行过程中会出现未知错误:

	scanf("%s %s %d",max->name,max->ID,max->score);
	printf("%s %c",max->name,max->name+3);
如下操作可以直接访问数组的内部成员,与上面的区别在于 直接打印%c格式需要对指针解地址:
<span style="color:#ff0000;">	</span>scanf("%s %s %d",max->name,max->ID,&max->score);
	printf("%s %c",max->name,*(max->name+3));

7总结:打印%s可以使用指针,因为字符串处理是要打印指针指向的地址之后的字符的,二打印%c,%d等需要使用*对指针解地址,再加上以下代码说明:
	scanf("%s %s %d",max->name,max->ID,&max->score);
	printf("%s %s",max->name,max->name+3);



  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值