结构体基础知识点(三)--结构体指针

本文深入探讨了C语言中结构体与指针的高级应用,包括指向结构体变量和数组的指针使用,以及如何利用结构体变量和指针作为函数参数处理复杂数据结构。通过实例讲解了如何输出结构体变量信息、遍历结构体数组以及实现数据的高效传递。

前期回顾

  结构体基础知识点(一)–建立自己的数据类型
  结构体基础知识点(二)–使用结构体数组


结构体指针

1. 指向结构体变量的指针

  指向结构体对象的指针变量既可以指向结构体变量,也可以指向结构体数组中的元素。指针变量的基类型必须与结构体变量的类型相同。例如:

struct Student *pt  // pt 可以指向 struct Student 类型的变量或数组元素

栗子1:

通过指向结构体变量的指针变量输出结构体变量中成员的信息

#include<stdio.h>
#include<string.h>

int main()
{
struct Student
{
	long int num;
	char name[20];
	char sex[10];
	float score;
};

struct Student stu_1;//定义struct Student类型的变量stu_1
struct Student *p;

p = &stu_1;
stu_1.num = 1010;
strcpy(stu_1.name, "Li Lin");//用字符串复制给stu_1.name赋值
strcpy(stu_1.sex, "Man");
stu_1.score = 89.5;

printf("num:%ld\nname:%s\nsex:%s\nscore:%5.1f\n", stu_1.num, stu_1.name, stu_1.sex, stu_1.score);
printf("\nnum:%ld\nname:%s\nsex:%s\nscore:%5.1f\n", (*p).num, (*p).name, (*p).sex, (*p).score);

return 0;

} 

在这里插入图片描述
说明
  为了事业方便直观,C语言允许把(*p).num 用 p–>num 来代替,"–>“代表一个箭头,p–>num 表示 p 所指的结构体变量中的num 成员。同样,(*p).name 等价于 p–>name。”–>"称为指向运算符。

  如果p 指向一个结构体变量 stu,以下3种用法等价:

  1. stu.成员名(如 stu.num);
  2. (*p).成员名(如 (*p).num);
  3. p–>成员名(如 p–>num);

2. 指向结构体数组的指针

栗子2:

有3个学生的信息,放在结构体数组中,要求输出全部学生的信息

#include<stdio.h>
 
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;
	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;
}

在这里插入图片描述
3. 用结构体变量和结构体变量的指针作函数参数

栗子3:

有n个结构体变量,内含学生学号,姓名和3门课程的成绩。要求输出平均成绩最高的学生信息(包括学号、姓名、3门课程成绩和平均成绩)

#include <stdio.h>
#define N 3

struct Student
{
	int num;
	char name[20];
	float socre[3];
	float aver;
};
void input(struct Student stu[])
{
	int i;
	printf("输入各学生的信息:姓名、学号、三门课成绩:\n");
	for(i=0;i<N;i++)
	{
		scanf("%d %s %f %f %f",&stu[i].num,stu[i].name,
			&stu[i].socre[0],&stu[i].socre[1],&stu[i].socre[2]);
		stu[i].aver=(stu[i].socre[0]+stu[i].socre[1]+stu[i].socre[2])/3;
	}
}
struct Student max(struct Student stu[])
{
	int i,m=0;
	for(i=0;i<N;i++)
		if(stu[i].aver>stu[m].aver)
			m=i;
	return stu[m];
}
void print(struct Student stud)
{
	printf("\n成绩最高的学生是:\n");
	printf("学号:%d\n 姓名:%s\n 三门课成绩:%5.1f,%5.1f,%5.1f\n 平均成绩:%6.2f\n",stud.num,stud.name,stud.socre[0],stud.socre[1],stud.socre[2],stud.aver);
}
int main()
{
	struct Student stu[N],*p=stu;
	input(p);
	print(max(p));
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值