C语⾔中的结构体------C语⾔的实体
C语⾔中的结构体——>C语⾔的实体
1.结构体概念
2. 结构体声明
3. 结构体定义
5. 结构体变量成员的引⽤
6. 结构体变量的赋值
7. 结构体变量的初始化
8. 结构体的嵌套
结构体的概念:
C语⾔中引⼊了⼀种构造出句类型成为结构体,他是由若⼲个成员构成,成员本⾝可以是基本数据类型,
也可以是其他构造类型,他相当与⾼级语⾔中的记录,类似与java⾼级语⾔中的实体类。可以表⽰⼀些复杂的数据类型;类似:
struct student{
char *name;
int age;
int num;
float weight;
};
结构体的声明:
结构体在使⽤之前,需要先声明结构体
声明的语法:
struct 结构体名称
{
类型说明符号成员名;//成员列表
};
成员表有若⼲个成员组成,每个成员都是该结构体的⼀部分,对每个成员必须做出类型说明,成员可以是基本数据类型,也可以是构造数据类型;
注意:
1. {}后⾯是要有分号”;”的
2. 结构体的声明可以在源⽂件程序的开头部分中,也可以声明在头⽂件中,⼀般在实际的开发过程中,都是定义在头⽂件中的;
3. 结构体的名字与其成员是可以重名的,结构体成员和其他变量也可以重名,
4. 结构体类型的名称必须是”struct 结构体名”,注意struct关键字是不能被省略的;
5. 结构体需要先声明在去使⽤
6. 结构体使⽤必须要 定义对应的结构体变量
7. 结构体类型相当与⼀个模型,声明的时候是不分配内存的,只有定义相应的结构体变量的时候,才会分配实际的内存
结构体变量的定义:
语法1:预先已声明结构体
struct 结构体名变量1,变量2,...变量n;
语法2:声明结构体的时候同时定义结构体变量
struct 结构体名{
成员列表;
} 变量名1,变量名2...变量n;
语法3:直接定义结构体变量
struct {
成员列表;
}变量名1,...,变量名n;
注意:结构体变量的定义尽量不要在头⽂件中,声明结构体的时候放在头⽂件中,结构体和结构体变量就类似与java中的类和对象之间的关系。
结构体变量成员的引⽤
C语⾔中不允许对结构体变量整体进⾏输⼊和输出的,对结构体变量的操作都是对结构体变量成员进⾏操作的。是个体关系,不能整体操作 引⽤⽅式:
结构体变量.成员名
机构体变量成员通过"."来引⽤
如果成员本⾝就是属于⼀个结构体类型的话,那么此时就继续⽤若⼲个点运算符号,⼀级⼀级的,直到到⾃⼰操作的那个
class.student.name = "zhangsan";
我们可以引⽤结构体变量成员的地址,也可以引⽤结构体变量的地址
结构体变量的赋值
初始化⽅法1:
结构体变量的赋值,就是对结构体变量的各个成员进⾏赋值
如:student.xh = 100;
student.name = "hello";
可以⽤输⼊语句来进⾏赋值:
scanf("%s %f",&student.sex,&student.score);
允许具有相同类型的结构体变量进⾏相互赋值:
student1 = student2;
注意:结构体中成员变量如果是字符数组的话,不能进⾏赋值,但是可以使⽤strcpy进⾏拷贝,如果是字符指针的话,可以直接进⾏赋值,所以在操作过程中我们尽量使⽤字符指针来进⾏操作;
注意:数组名本来就是地址,所以在赋值的时候,不需要加&符号:
char gender[30];
如:scanf("%s",gender);
没有进⾏赋值初始化的时候,由于结构体变量是局部变量,因此存储在栈中,其初始的值是随机数值;其占⽤的字节数等于它成员变量占⽤的总的字节数,成员越多,其占⽤的字节数也就越多
初始化⽅法2:
预先已声明结构体再定义结构体变量并初始化:
struct 结构体名变量名1 = {成员值类表},...,
变量名n = {成员值列表};
初始化⽅法3:
声明结构体的同时定义结构体变量并且初始化:
struct 结构体名{
成员变量;
}变量名1 = {成员数值列表},变量名2 = {成员数值列表},...,变量名n ={成员值列表};
初始化⽅式4:
直接定义结构体变量并且初始化
strcut {
成员列表;
}变量名1={成员值列表},...,变量名n={成员值列表};
结构体的嵌套
可以将⼀个结构体放⼊另外⼀个结构体内,但是结构体不能嵌套它⾃⾝,如果嵌套⾃⾝的话,就必须是结构体指针类型
struct address{
char country[20];
char city[20];
}
struct student{
int xh;
char name[20];
struct address addr;
};
要访问结构体address中的成员,⽽address是另外⼀个结构体student的成员,可以通过点运算符的链式⽅式访问
如:访问成员country: untry
访问city:stu.addr.city;
下⾯通过代码来完整的展⽰下结构体的玩法:
#ifndef __TEACHER_H_
#define __TEACHER_H_
/*定义⼀个街道结构体,成员变量为国家,城市,和街道*/
struct address{
char *country;
char *city;
char *street;
};
/*定义⼀个teacher结构体,成员变量为编号,年龄,姓名,⼯龄,地址*/
struct teacher{
int num;
int age;
char *name;
int teach_year;
struct address addr;
};
#endif
源⽂件代码
#include<stdio.h>
#include<stdlib.h>
#include"teacher.h"
#include<string.h>
struct score{
int math_score;
int chinese_score;
int english_score;
};
/*定义⼀个学⽣类型*/
struct student{
int xh;//
char *name;
int class;
struct address addr;
struct score all_score;
}zzf ={1,"zzf",3,{"china","shanghai","yindu_road"},{80,85,90}};//声明的时候直接去定义⼀个学⽣zzf,并且初始化。
//打印出学⽣的信息
//打印出学⽣的信息
void printfStudentInfo(struct student stu);
void printfTeacherInfo(struct teacher tea);
int main(int argc,char *argv[]){
printfStudentInfo(zzf);
printf("==========================\n");
//定义的时候初始化
struct teacher teacher_zhang = {1,50,"zhang",5,{"china","minhang","yizhong"}};
printfTeacherInfo(teacher_zhang);
printf("===============================\n");
//先定义后初始化
struct teacher teacher_wang;
teacher_wang.num = 2;
teacher_wang.age = 40;
teacher_wang.name = "wang";
ach_year = 10;
teacher_untry = "china";
teacher_wang.addr.city = "shanghai";
teacher_wang.addr.street ="chunshen_road";
printfTeacherInfo(teacher_wang);
printf("=============相同结构体名变量jiegouti赋值======\n");
struct teacher teacher_other;
teacher_other = teacher_wang;
printfTeacherInfo(teacher_wang);
printf("==============================");
//不去定义结构体名,然后直接定义结构体变量
struct{
char book_name[20];
int pages;
int charpter_nums;c语言中struct
}math_book;
//如果使⽤字符数组的话,就必须使⽤strcpy才能赋值
strcpy(math_book.book_name,"jihe");
math_book.pages = 150;
math_book.charpter_nums = 12;
printf("book name:%s,book pages:;%d,book charpter_nums:%d\n",math_book.book_name,math_book.pages,math_book.charpter_nums);
return0;
}
void printfStudentInfo(struct student stu){
printf("stu xh:%d\n",stu.xh);
printf("stu name:%s\n",stu.name);
printf("stu class:%d\n",stu.class);
printf("student country:%s,city:%s,street:%s\n",untry,stu.addr.city,stu.addr.street);
printf("student math:%d,chinese:%d,english:%d\n",stu.all_score.math_score,stu.all_score.chinese_score,stu.lish_score);
}
void printfTeacherInfo(struct teacher tea){
printf("teacher num:%d\n",tea.num);
printf("teacher age:%d\n",tea.age);
printf("teacher name:%s\n",tea.name);
printf("teacher teacher_year:%d\n",ach_year);
printf("teacher country:%s,city:%s,street:%s\n",untry,tea.addr.city,tea.addr.street);
}
代码是可以直接进⾏run的,谢谢⼤家观看。本⼈是⼀个新C的Coder,持续更新中,有什么疑问或者错误的地⽅,请看官们及时指出,谢谢⼤家
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论