C语言小题,有3个学生的信息,放在结构体数组中,要求输出全部学生的信息。(指向结构体数组的指针)

前言:
此篇是针对 指向结构体数组的指针 方面的练习。

解题思路:
用指向结构体变量的指针来处理:
(1)声明结构体类型 struct Student ,并定义结构体数组,同时使之初始化;
(2)定义一个指向 struct Student 类型数据的指针变量 p;
(3)使 p 指向结构体数组的首元素,输出它指向的元素中的有关信息;
(4)使 p 指向结构体数组的下一个元素,输出它指向的元素中的有关信息;
(5)再使 p 指向结构体数组的下一个元素,输出它指向的元素中的有关信息。

正文:

#include<stdio.h>
struct Student{								//声明结构体类型struct Student 
	int num;
	char name[20];
	char sex;
	int age;
};
struct Student stu[3]={{10101,"Li Lin",'M',18},{10102,"Zhang Fang",'M',19},
						{10104,"Wang Min",'F',20}};	//定义结构体数组并初始化 
int main() {
	struct Student *p;						//定义指向struct Student结构体变量的指针变量 
	printf(" No.  Name                 sex age\n");
	for(p=stu;p<stu+3;p++)
		printf("%5d %-20s %2c %4d\n",p->num,p->name,p->sex,p->age);
										//输出结果 
	return 0;
}

程序分析:
p 是指向 struct Student 结构体类型数据的指针变量。在 for 语句中先使 p 的初值为 stu,也就是数组 stu 第1个元素的起始地址,见图9.6 中 p 指向。在第1次循环中输出 stu[0] 的各个成员值。然后执行 p++,使 p 自加1.p 加1意味着 p 所增加的值为结构体数组 stu 的一个元素所占的字节数。执行 p++后 p 的值等于 stu+1,p 指向 stu[1],见图9.6 中 p’ 的指向。在第2次循环中输出 stu[1] 的各成员值。在执行 p++ 后,p 的值等于 stu+2,它的指向 见图9.6 中的 p’’,再输出 stu[2] 的各成员值。在执行 p++ 后,p 的值变为 stu+3,已不再小于 stu+3了,不再指向循环。
在这里插入图片描述

注意:
(1)如果 p 的初值为 stu ,即指向 stu 的第1个元素,p 加1后,p 就指向下一个元素。例如:

(++p)->num 先使 p 自加1,然后得到 p 指向的元素中的 num 成员值(即10102)。
(p++)->num 先求得 p->num 的值(即10101),然后再使 p 自加1,指向 stu[1]。

请注意以上二者的不同。
(2)程序定义了 p 是一个指向 struct Student 类型对象的指针变量,它用来指向一个 struct Student 类型的对象(在例9.6中的 p 的值是 stu 数组的一个元素(如 stu[0]或 stu[1] )的起始地址),不应用来指向 stu 数组元素中的某一成员。例如,下面的用法是不对的:

p=stu[1].name;	//stu[1].name是stu[1]元素中的成员name的首字符的地址

编译时将给出 “警告” 信息,表示地址的类型不匹配。不要认为反正 p 是存放地址的,可以将任何地址赋给它。如果要将某一成员的地址赋给 p,可以用强制类型转换,先将成员的地址转换成 p 的类型。例如:

p=(struct Sutdent*)stu[0].name;

此时,p 的值是 stu[0]元素的 name 成员的起始地址。可以用 “printf("%s”,p);“输出 stu[0] 中成员 name 的值。但是,p 仍保持原来的类型。如果执行 ”printf(”%s“,p+1);“,则会输出 stu[1] 中 name 的值。执行 p++时,p的值增加了结构体 struct Student 的长度。

总结:
运行结果:
在这里插入图片描述

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级Mr Yin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值