C语言结构体
结构体
结构体的基础作用
结构体是一种数据结构
表示一个用户的多个信息,使得信息更加系统,分配内存更加集中
结构体变量的定义
第一步:声明一个结构体模板
struct 结构体名 { 数据类型 成员1名字; 数据类型 成员2名字; ...... };
结构体的名字称为结构体标签,里面的变量称为结构体成员
值得注意的是:结构体模板只是声明了一种数据类型,定义了数据的组织形式,并没有声明结构体的变量,因而编译器不给他分配内存,所以还要有第二步
第二步,利用结构体数据类型定义结构体变量
方法一:先声明结构体模板,再定义结构体变量
struct student stu1;
struct student全部都是结构体类型,后面的stud1才是结构体变量
方法二:在声明结构体模板的同时定义结构体变量
struct 结构体名 { 数据类型 成员1名字; 数据类型 成员2名字; ...... }stu1;
这种情况下结构体名可以被省略,但是因为没有指定结构体标签,不能在程序的其他处定义结构体变量,所以并不常用
用typedef定义数据类型
typedef用于为系统固有的或者程序员自定义的数据类型定义一个别名(换成人话,就是这个玩意可以用来给数据类型一个别名)
例如:
typedef int INTEGER
这就是给int定义了一个新的名字INTEGER,他俩就是同义词。
当然也可以给结构体定义一别名,例如
typedef struct student STUDENT
它和
typedef struct student { long studentID; ...... }STUDENT;
是等价的,二者都是为这个结构体类型定义了一个新的名字STUDENT,也就是STUDENT和struct student是同义词。
因此STUDENT stu1,stu2;
与sturct student stu1,stu2,;
他俩是等价的。
也就是说,一个结构体模板就相当于一个变量类型
值得注意的是,typedef知识一种为已存在的类型定义一个新的名字而已,并没有定义新的数据类型
结构体变量的初始化
结构体变量的成员可以通过将成员的初值置于花括号之内进行初始化
STUDENT stu1={100310121,"王刚",‘M’,1991,{72,83,90,82}};
它等价于
struct student stu1={100310121,"王刚",‘M’,1991,{72,83,90,82}};
也就是它们中的元素被一次初始化;
一但定义了结构体变量stu1和stu2,那么这两个变量就都具有了STUDENT类型的结构,相当于用结构体模板生产了两个独立的与结构体类型一致的变量。
C语言允许对具有相同类型的结构体变量进行整体赋值,也就是说,下面的例子是成立的
stu2=stu1;
在对结构体成员逐个赋值的时候,遇到字符串的时候要格外注意,要是用字符串函数strcpy进行赋值,而不能直接等于
结构体变量的引用
C语言规定,不能对结构体变量作为一个整体进行输出,只能对其中的每一个变量进行输入输出操作。
访问结构体变量的成员必须使用成员选择运算符(也称圆点运算符),即
结构体变量名.成员名
stu1.month=5;
结构体指针
定义变量:
STUDENT *pt;
初始化变量
pt=&stu1;
访问方式有两种,第一种使用圆点运算符:
(*pt).studentID=100310121;//(这种方式不常用)
第二种使用指向运算符(也称箭头运算符)
pt->studentID=100310121;
结构体数组
定义变量
STUDENT stu[10];
这是一个存放结构体的数组,每次使用使用的时候就用stu[i]去找结构体就行
然而当结构体数组和结构体指针混用到一起时
STUDENT* ps=stu;//和之前数组的使用方法是一致的
连续访问的时候,只需要让ps++就可以
向函数传递结构体
三种方式
(1)用结构体的单个成员作为函数参数,向函数传递结构体的每个成员
(2)用结构体变量做函数参数,向函数传递结构体的完整结构。
这种方式也是传值调用,不会改变实参的值
(3)用结构体指针或者结构体数组做函数参数,向函数传递结构体的地址
这种方式可以对实参进行改变。
总结
结构体使用四步骤:
1.声明结构体模板
struct date { int year; int month; int day; };
2.定义结构体变量
struct date date1;
其中这两步可以合成一步:
struct date { int year; int month; int day; }date1;
3.变量初始化:
date1.year=2022;
4.引用结构体变量
printf("%d",date1.year);
typedef的作用只是给一种变量起一个新的名字:
并且它有两种方式:
1.
struct date { int year; int month; int day; }; typedef struct date DATE;
2.
typedef struct date { int year; int month; int day; }DATE;
结构体指针的使用
定义和初始化:
struct date *pt=&stu1;
使用的常用方式:
pt->month=11;
利用指针传递结构体的方式
struct date { int year; int month; int day; }; void Func(struct date *pd) int main() { struct date date1; Func(&date1); }