Struct
- 结构体:将不同数据类型结合为一个整体的新的数据类型
- 定义:
struct student{
char name[10];
int total_points;
char friend[10];
}
定义了一种自定义的、抽象的、非实例的数据类型,可以衍生出多个具体的结构变量
eg:
name:哈哈
total_points:100
friend:嘻嘻
- 结构体变量赋值方式
struct student s1= {“哈哈”,100,“嘻嘻”};
struct student s1= {.name=“哈哈”,.total_points=100,.friend=“嘻嘻”};
struct student s1= {.total_points=100,.friend=“嘻嘻”,.name=“哈哈”};
都表示:名字叫哈哈,总分100分,朋友是嘻嘻
- 修改或访问结构体变量的值
s1.total_points=99;
strcpy(s1.total_points,99);
strcpy(s1.name,"啦啦");
- 内存空间
char[10] 10byte,int 4byte,char[10] 10byte
结构体内存空间非简单相加(10+4+10),要进行字节对齐
short 2byte 需起始于偶数地址
int/ float 4byte 需起始于能被4整除的地址
long/ double 8byte 需起始于能被8整除的地址
结构体总大小必须为最宽类型字节数的整数倍
eg:
先找到能被1整除的地址作为int name的起始地址,分配10个byte;
向后依次找到能被4整除的地址作为int total_points的起始地址,分配4个byte,系统将中间的间隙填充;
向后依次找到能被1整除的地址作为char friend的起始地址,分配10byte;
判断总大小是否为4的整数倍;
若是结束,否则 在后填充空位至大小为4的整数倍停止。
- 与其他数据类型相似之处
相同结构体之间可以相互赋值
struct student s1;
struct student s2;
s1=s2;
定义一个数组存放结构体
struct student s[i];
结构体嵌套:在结构体中定义一个结构体成员
struct grade1{
int total_number[];
struct student s1;
}
指针
struct student *sp; //指针声明 指向student结构体的指针sp
struct student *sp =&s1; //获得结构体的地址,s1的首地址
使用指针访问结构体中的成员
1、*sp=s1指针解引用,使用点运算符(*sp).name=s1.name
2、sp->name
参考视频
typedef struct
typedef作用:为一种数据类型(int char 等及struct)定义一个新名字
1、定义一个s1结构
typedef struct {
char name;
char friend;
} s1;
int main()
{
s1 mine;// OK s1 是一个类型
s1.name = "嘻嘻";// ERROR
}
2、定义一个s2的结构变量,并没有定义一个结构。
struct {
char name;
char friend;
} s2;
int main()
{
s2 mine;// ERROR
s2.name = "嘻嘻";// OK s2是一个变量
}