何为结构体

文章介绍了C语言中结构体类型的声明与变量定义,包括先声明后定义、同时声明定义以及直接定义结构体变量的方法。还讲解了如何引用结构体变量的成员,以及结构体数组和结构体指针的用法,包括通过指针遍历结构体数组并打印信息。此外,文章提到了将结构体指针作为函数参数可以提高效率,但可能引发数据修改的问题。
摘要由CSDN通过智能技术生成

结构体类型和结构体变量

1.声明一个结构体类型的一般形式为:
struct 结构体名:用来标识一个结构体
{
成员列表:成员可以是任何c语言的数据类型
}; 注意:这里一定要写分号;因为声明结构体也是一个c语言语句

声明了一个结构体,相当于构造了一种新的数据类型,此时系统并不为它分配内存空间,只有定义力结构体类型的变量,系统才为该变量分配内存空间,声明了结构体后,就可以定义结构体类型的变量

2.定义一个结构体类型的变量

(1)先声明结构体类型再定义变量名

strucu studnet{
int num;
int age;
char sex;
};
student1={1101,17,'f'};
student2={1102,19,'m'};

(2)声明结构体类型同时定义变量名

struct student{
int num;
int age;
char sex;
} student1,student2;

(3)不指定类型名直接定义结构体类型变量

struct student{
int num;
int age;
char sex;
}a={1101,18,'f'};

3.引用结构体变量

类型名.成员名

同一结构体变量之间可以直接赋值(整体赋值,成员逐个依次赋值)

结构体数组

定义一个结构体数组

struct student{
intnum;
char name[20];
char sex;
int age;
float score;
char addr[30];
}struct student[3];

结构体数组初始化

struct student{

int num;

...

}

struct student stu[]{ {...},{...},{...}...};

结构体指针

若p指向一个结构体变量

1)结构体变量.成员名  如    s.sum

(2)(*结构体指针变量).成员名  如(*p).num

(3)结构体指针变量->成员名  如 p->num

#include<stdio.h>
struct students{
int num;
char name[20];
char sex;
int agr;
};
struct students stu[3]={{101,"ling",'M',18},{102,"zhao",'F'19},{103,"zhang",'M',17}};%
void main()
{
struct student *p;
printf("num 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};
}

结构体指针作为函数参数

结构体变量名代表整个结构体变量本身,当把结构体变量本身作为参数传递时,结构体内部的结构体成员较多时会造成时间和空间开销大,影响程序的运行效率

使用结构体指针作为参数传递时,因为传递的是地址,会比原本含有较多结构体的结构体变量更加块,但是也会造成结构体变量数据被修改的可能

#include<stdio.h>
#define N3;
struct student{
int num;
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 stu[N],*p=stu;
input (p);
printf(max(p));
}
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].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;
for(i=0;i<N;i++)
if(stu[i].aver>stu[m].aver)m=i;
return stu[m];
}
void print(struct student stu)
{
printf("学号:%d\n 姓名 :%d\n 三门成绩 :%5.1f%5.1f%5.1f\n  平均成绩 :%6.2\n",stu.num,stu.name stu.score[0],stu.score[1],stu.score[2],stu.aver");
printf("\n");
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值