随风而动,随遇而安......
C语言结构体数组、指针与函数-学习二十八
02/23
本文最后更新于
2022年08月13日,已超过
823天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
结构体数组
结构体数组的定义
- 一个结构体变量只能存放一组有关联的数据,比如一个学生的数据,
如果要存放多个学生的数据,就要使用结构体数组。 - 在声明了结构体类型之后,结构体数组的定义与基本类型数组的定义完全相同。
- 例如:
struct student{
long int no;
char name[20];
char sex;
float score;
};
struct student stu[3];
- 定义了struct student类型的数组,数组名为stu,包含3个数组元素,每个数组元素都是一个struct student类型的结构体变量,分别是stu[0].stu[1].stu[2]。
结构体数组的引用
产表示下标为i的结构体数组元素的成员no的值
stu[i].no;
产表示下标为i的结构体数组元素的成员name的首地址(name为char数组)
stu[i].name;
表示下标为i+1的结构体数组元素的成员sex值
stu[i+ 1].sex;
产表示下标为i- 1的结构体数组元素的成员score的地址
&stu[i- 1].score;
结构体数组的初始化
- 结构体数组和基本类型数组一样可以初始化,只是每个元素的初值是由括起来的一组数据,
初始化的形式是定义数组的同时,在其后面加上“={初值表列}”。
- 例如:
struct student{
int num;
char name[20];
char sex;
int age;
}
struct student stu[3]={
{100,"Wang Lin",M',20},
{101,"Li Gang", 'M',19},
{110,"Liu Yan", F,19}
};
- 例子
有3个候选人,每个选民只能投票选一人,要求编一个统计选票的程序,先后输入被选人的名字,进行投票,最后输出各人得票结果。
#include <stdio.h>
#include <string.h>
void main() {
struct Person {
char name[20];
int count;
}leader[3] = { {"Zhangsan",0},{"Lisi",0},{"Wangwu",0} };
int i, j;
char leader_name[20];
printf("请输入支持的候选人名字:\n");
for (i = 0; i < 10; i++) {
scanf_s("%s", leader_name,20);
for (j = 0; j < 3; j++) {
// strcmp函数比较字符串是否相同,相同就返回 0
if (strcmp(leader_name, leader[j].name) == 0) {
leader[j].count++;
}
}
}
printf("\n");
for (i = 0; i < 3; i++) {
printf("%s:%d\n", leader[i].name, leader[i].count);
}
}
有n个学生的信息(包括学号、姓名、成绩),要求按照成绩的高低顺序输出各学生的信息。
#include <stdio.h>
struct Student {
int no;
char name[20];
float score;
};
void main() {
struct Student stu[5] = {
{10001,"Zhangsan",98.5},
{10002,"Lisi",80.5},
{10003,"Wangwu",80.5},
{10004,"Zhaoliu",100},
{10005,"Xiqi",59}
};
struct Student temp;
// 定义常量
const int n = 5;
int i, j, k;
printf("成绩排行榜\n");
for (i = 0; i < n; i++) {
for (j = i + 1; j < n; j++) {
if (stu[j].score>stu[i].score) {
temp = stu[j];
stu[j] = stu[i];
stu[i] = temp;
}
}
}
for (i = 0; i < n; i++) {
printf("%d %10s %.2f\n",stu[i].no,stu[i].name,stu[i].score);
}
}
结构体指针
指向结构体变量的指针
- 指向结构体对象的指针变量既可以指向结构体变量,也可以用来指向结构体数组中的元素。
- 指针变量的基类型必须与结构体变量的类型相同。
定义格式:
struct
结构体名
*结构体指针变量名
例如:
struct Student stu;
struct Student *pt;
- 赋值
pt = &stu;
- 1.结构体类型只能表示一个结构形式,编译程序并不对它分配内存单元。
- 2.定义指向结构体类型的指针变量并确定它的指向后,就可以用结构体指针变量访问所指向的结构体的成员。
指针变量访问结构体变量的成员有以下几种形式
(1)
(*结构体指针变量).成员名
括号不能省略,因为 “.” 运算符优先级高于 “*” 的- 例如:
(*sp).name
- 例如:
(2)
结构体指针变量 -> 成员名
C语言提供了一种简便的结构体指针变量取成员运算 “->”称为指向成员运算符(或箭头运算符),和 “.” 优先级差不多,结合性都是从左往右。- 例如:
sp -> name
- 例如:
(&结构体变量) -> 成员名
- 例如:
(&stu) -> namae
- 例如:
- 当用结构体变量访问结构体数据成员时用 “.” 运算符比较方便;
当用指针访问结构体成员时用 “->” 运算符比较方便。
- 例如
sp -> no
sp指向结构体变量stu,sp -> no
等价于stu.no
sp -> no++
指向运算符 “->” 高于 “++” ,等价于(sp -> no)++
。先引用sp -> no
值,即stu.no
作为表达式的值;再使其值加1,即stu.no
值加1。++sp -> no
指向运算符 “->” 高于 “++” ,等价于++(sp -> no)
即先使sp->no
值加1,即stu.no
值加1;然后引用修改之后的sp -> no
值作为表达式的值。
- 例子
#include <stdio.h>
struct Student {
int no;
char name[20];
float score;
};
void main() {
struct Student *p;
struct Student stu = {10001,"Zhangsan",98.5};
p = &stu;
printf("学号:%d\n姓名:%s\n成绩:%.2f\n",(*p).no,p -> name,(&stu) -> score);
}
指向结构体数组的指针
- 可以用指针变量指向结构体数组的元素。
- 例如:
有3个学生的信息,放在结构体数组中,要求全部学生的信息。
#include <stdio.h>
struct Student {
int no;
char name[20];
float score;
};
void main() {
struct Student *p;
struct Student stu[5] = {
{10001,"Zhangsan",98.5},
{10002,"Lisi",80.5},
{10003,"Wangwu",80.5},
{10004,"Zhaoliu",100},
{10005,"Xiqi",59}
};
for (p = stu; p<stu+5; p++) {
printf("%d %10s %.2f\n",p->no, p->name, p->score);
}
}
用结构体变量和结构体变量的指针作函数
结构体作为函数参数
- 对结构体数据操作时,常常需要将结构体变量的成员、结构体变量、结构体数组名或结构体指针作为参数
传递给另一个函数。
- 对结构体数据操作时,常常需要将结构体变量的成员、结构体变量、结构体数组名或结构体指针作为参数
1.用结构体变量的成员作参数
- 用法和用普通变量作实参是一样的,属于“值传递”方式。
- 应当注意实参与形参的类型保持一致。
例如:
- 用
stu[1].num
或stu[2].name
作函数实参,将实参值传给形参。
- 用
2.用结构体变量作实参
- 用结构体变量作实参时,将结构体变量所占的内存单元的内容全部按顺序传递给形参。
- 形参也必须是同类型的结构体变量。
- 在函数调用期间形参也要占用内存单元,这种传递方式在空间和时间上开销较大。
- 在被调用函数期间改变形参(也是结构体变量)的值,不能返回主调函数。
3.用指向结构体变量(或数组元素)的指针作实参
- 用指向结构体变量(或数组元素)的指针作实参时,将结构体变量(或数组元素)的地址传递给形参。
结构体与函数之间的关系主要是:
- 1.结构体作为函数的参数。
- 2.结构体可以作为函数的返回值。
- 例子:
有n个结构体变量,内含学生学号、姓名和3门课程的成绩。要求输出平均成绩最高的学生的信息(包括学号、姓名、3门课程成绩和平均成绩)。
#include <stdio.h>
#define N 3
struct Student {
int no;
char name[20];
float score[3];
float aver;
};
void main() {
void input(struct Student stu[]);
struct Student max(struct Student stu[]);
void print(struct Student stu);
struct Student *p;
struct Student stu[N];
p = stu;
input(p);
print(max(p));
}
void input(struct Student stu[]) {
int i;
printf("请输入各学生信息:\n");
for (i = 0; i < N; i++) {
scanf_s("%d %s %f %f %f",
&stu[i].no, stu[i].name,20, &stu[i].score[0],
&stu[i].score[1], &stu[i].score[2]);
stu[i].aver = (stu[i].score[0] + stu[i].score[1] + stu[i].score[2]) / 3.0;
}
}
struct Student max(struct Student stu[]) {
int i,m=0;
int temp;
for (i = 0; i < N; i++) {
if (stu[i].aver > stu[m].aver) {
m = i;
}
}
return stu[m];
}
void print(struct Student stud) {
printf("学号:%d\n姓名:%s\n三门成绩:%.2f %.2f %.2f\n平均成绩:%.2f\n",
stud.no, stud.name, stud.score[0], stud.score[1], stud.score[2], stud.aver);
}