结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。
结构里的那些数据被称为成员变量。
成员变量也可以是数组,指针,结构体。
2声明struct student
{
char name[20]; //姓名
int number; //学号
int score; //成绩
};
1.先写关键字 struct 再写结构体名字 student (这个名字自己随便起)
2.花括号{} , {}里面的东西叫代码块,这里面包含成员变量
3.定义成员变量. 如: char name [20]
4. 最后花括号 } 后面要加分号 ;
3.结构体变量的定义与初始化(1)在声明结构体的同时定义结构体变量
struct student
{
char name[20]; //姓名
int number;//学号
int score; //成绩}stu1={"zhang san" , 111111,100}; //定义结构体变量后直接初始化
(2)先声明结构体,再单独定义结构体变量
struct student
{
char name[20]; //姓名
int number;//学号
int score; //成绩};
struct student stu1={"zhang san" , 111111,100}; ; //单独定义结构体变量并初始化(这句话应该在主函数中)
(3)最不推荐的 不写结构体名
struct
{
char name[20]; //姓名
int number;//学号
int score; //成绩char sex; //性别
}stu1={"zhang san" , 111111,100,'M'};
注意:在初始化结构体变量时,数据之间用逗号隔开,当数据为字符串时,用双引号括起来 ;数据为字符时,用单引号括起来;数据为数字,直接写就行。
4.结构体成员的访问用点 *** 作符“ . " 结构体变量名.成员变量 如:stu1.number
#include二、结构体数组 定义结构体数组并初始化struct student { char name[20]; //姓名 int number;//学号 int score; //成绩 }stu1; //在声明结构体的同时定义结构体变量 int main () { stu1.number =11111; //访问stu1的学号 printf("%d",stu1.number ); return 0; }
与 定义并初始化结构体变量一样,只需要将变量名变成数组名即可。
对比一下啊
(1)在声明结构体的同时定义结构体变量
struct student
{
char name[20]; //姓名
int number;//学号
int score; //成绩}stu1={"zhang san" , 111111,100}; //定义结构体变量后直接初始化
下面看结构体数组的
(1)在声明结构体的同时定义结构体数组
struct student
{
char name[20]; //姓名
int number;//学号
int score; //成绩}stu[3]={ {"zhang san" , 111111,100},
{"li si" , 111112,99 },
{"wang wu" , 111113,98} }; //定义结构体数组后直接初始化
如图所示
区别:将结构体变量stu1 改成了结构体数组 stu[3],就完成了结构体数组的定义,其他定义结构体变量的方法 对 定义结构体数组也同样适用 。
初始化方面:结构体数组的初始化相当于初始化了多个结构体变量,
注意:在初始化结构体数组时,每一个数组元素都要用一个 {}括起来,每两个数组元素中间都要用逗号“,”隔开,最后整体还要用一个{}括起来,加上分号“ ;”
三、结构体指针 1.指向结构体变量的指针定义结构体指针的一般形式如下
结构体类型 *指针名
如:struct student *p
用结构体指针访问成员有两种方法:
一种是用点运算符“.” 。如 (*p).成员名 注意:一定要把*p 用括号括起来
一种是用指向运算符“ ->”。如 p->成员名
#include2.指向结构体数组的指针struct student { char name[20]; //姓名 int number;//学号 int score; //成绩 }stu1; //在声明结构体的同时定义结构体变量 void print(struct student* p) { printf("%dn", (*p).number); //可以用点 printf("%dn",p->score ); //也可以用“->”指向运算符 ,指向成员 } int main () { struct student stu1={"zhangsan",111111,100}; print(&stu1); return 0; }
结构体指针不仅可以指向结构体变量,还可以指向结构体数组,此时指针变量的值就是结构体数组的首地址。
比如前面已经定义了一个结构体数组 stu[3],用结构体指针指向这个数组
struct student *p;
p=stu; //此时指向的是数组的首地址
//还可以直接指向数组中的某一个元素的地址
p=&stu[2]; //只需要加上 取地址符号 & 和下标 [2] 就行
#include#include struct student { char name[20]; //姓名 int number;//学号 int score; //成绩 }stu[3]={ {"zhang san" , 111111,100}, {"li si" , 111112,99 }, {"wang wu" , 111113,98} }; int main () { struct student *p1,*p2; p1=stu; //指向数组首地址 p2=&stu[2];//指向数组中的元素 printf(" %s , %d ,%d n",p1->name ,p1->number ,p1->score ); printf(" %s , %d ,%d n",p2->name ,p2->number ,p2->score ); return 0; }
指针变量也可以进行自加或自减运算
#include#include struct student { char name[20]; //姓名 int number;//学号 int score; //成绩 }stu[3]={ {"zhang san" , 111111,100}, {"li si" , 111112,99 }, {"wang wu" , 111113,98} }; int main () { struct student *p1; p1=stu; int i; for(i=0;i<3;i++,p1++) { printf(" %s , %d ,%d n",p1->name ,p1->number ,p1->score ); } return 0; }
注意: (++p)->name 是先执行++ *** 作,使p指向下一个元素的地址,在取得该元素的成员值
(p++)->name是先执行指向 *** 作,使p指向这个元素的地址,取得这个元素的成员值,再使p指向下一个元素的地址。
3.结构体作为函数参数 1).使用结构体变量作为函数参数这是使用了值传递,会将结构体变量的所有内容全部传递给形参,形参也必须是同类型的结构体变量,而且如果在形参中改变了结构体变量成员的值,这个改变的值不会返回到主函数中。
例如: void Display(struct student stu)
(因为值传递是单向传递,只能从实参传递到形参,不能从形参传递到实参,要想在形参中改变结构体变量的值并返回到主函数,需要用到指针,后面会进行解释)
#include2).使用 结构体指针 作为函数参数#include struct student { char name[20]; //姓名 int number;//学号 int score[3]; //成绩 }stu= {"zhang san" , 111111,100,99,98}; void Display(struct student stu) //计算平均成绩 { printf("score 1 : %dn",stu.score [0]); printf("score 2 :%dn",stu.score [1]); printf("score 3 : %dn",stu.score [2]); printf("average score : %d",(stu.score [0]+stu.score [1]+stu.score [2])/3); } int main () { Display(stu); return 0; }
前面用结构体变量做函数参数,形参中改变变量成员的值不能返回到主函数中,现在用指针来进行传递
例如:void Display(struct student *p)
#include4.包含结构的结构#include struct student { char name[20]; //姓名 int number;//学号 int score[3]; //成绩 }stu= {"zhang san" , 111111,100,99,98}; void Display(struct student *p) { printf("score 1 : %dn",(*p).score [0]); p->score [0]=97; //更改数据 } int main () { struct student *p; p=&stu; Display(p); //因为形参是指针形式,所以这里只需要写 "p" 表示地址,别写成 "*p" printf("score 1 : %dn",p->score [0]); //更改完成之后的数据被返回到了主函数 return 0; }
结构体成员类型不仅可以是基本类型,也可以是结构体类型
例如定义一个结构体表示学生信息,包含姓名学号出生日期,日期又属于一个结构体类型,包括年月日。这样学生信息的结构体就包含了日期的结构体
#include#include struct date { int year;//年 int month;//月 int day;//日 }; struct student { char name[20]; //姓名 int number;//学号 struct date birthday; //出生日期 }stu= {"zhang san",111111,{2003,2,6}}; int main () { //输出学生信息 printf("name : %sn",stu.name ); printf("number : %dn",stu.number ); printf("birthday : %d %d %dn",stu.birthday.year,stu.birthday.month,stu.birthday.day); return 0; }
1).因为birthday是结构体,所以赋值时要用{}将数据括起来
2).stu.birthday.year 表示结构体stu中的结构体birthday中的成员year的值 (逐级递减,一直到最底层)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)