C语言 结构体

来源:互联网 发布:mac删除文件命令行 编辑:程序博客网 时间:2024/06/05 17:07
0728
第九章
一、类型重定义
typedef
格式:typedef 已存在的类型 类型别名;//一般情况下类型别名大写。
1)作用:给已经存在的类型取别名。
好处:增强程序的可读性;可以简化程序;
注意&与typedef区别:&为变量取别名;typedef为已存在的类型取别名。
二、结构体的定义
定义格式:struct 结构体名{结构体成员列表};(C++中有class)
结构体成员只有确定了结构体类型的变量才会分配空间。
三、定义结构体三种形式
1)只定义结构体
struct student
{
char id[10];
char name[26];
char *sex;
int gradePoints;
};
struct student aStudent;
struct student topStudent;
2)定义结构体的同时声明结构体变量
struct student
{
char id[10];
char name[26];
int gradePoints;
}aStudent,topStudent;
3)类型重定义
typedef struct student
{
char id[10];
char name[26];
int gradePoints;
}STUDENT,ASTUDENT;
声明变量:
STUDENT aStudent;
STUDENT topStudent;
ASTUDENT aTeacher;
ASTUDENT atopTeacher;
等价于:
struct student aStudent;
struct student topStudent;
struct student bStudent;
struct student btopStudent;
注意:
1)struct
{
int a;
int b;
double c;
float d;
}aa,bb,cc;
此类结构体的声明,只能在声明结构体的同时声明变量。
2)typedef struct
{
int a;
int b;
double c;
float d;
}TEST;
TEST dd;
此类结构体的声明,可以通过重定义TEST声明变量。
四、结构体初始化和结构体访问(”.”和”->”)
1)在生命结构体变量的同时使用{}初始化;
2)逐个成员初始化;
//注意:数组名不可以做左值。如果需要对字符数组初始化,则利用strcpy函数实现。
//当结构体成员列表中有字符指针。对字符指针初始化时:可以直接对字符指针变量初始化。
①student zhangsan = {“12”,“张三”,21};//与结构体成员列表相对应。(类似于数组初始化)
②student lisi;
lisi.gradePoints=21;
strcpy(lisi.id,”12”);//lisi.id=“12”;的格式是错误的。数组名不可以做左值。如果需要对字符数组初始化,则利用strcpy函数实现。
strcpy(lisi.name,”张三”);
关于结构体类型的指针
student* wangwu;
wangwu = &zhangsan;
(*wangwu).gradePoints=22;//等同于wangwu->gradePoints = 22;指向运算符。
注意:(*wangwu).gradePoints。其中*wangwu必须加括号,考虑到优先级的问题。
wangwu->gradePoints = 40;//wangwu”指向“的结构体变量的gradePoints成员


补充,结构体在内存中的存储情况。
以8字节为一个单位,按程序的执行顺序依次分配存储空间。每个变量分配存储空间都是以8字节为单位,如果一个变量需要的存储空间,刚好是上一个变量分配8字节所剩下的空间,则不再重新划分8字节。如果不够,则重新分配8字节,直到分配够为止。当分配完成时,如果由最后一个变量分配的8字节有剩余,系统会自动补齐。
所以,结构体分配的存储空间大小一定是8字节的整数倍。
0 0
原创粉丝点击