结构体与动态内存:
一、结构体
<1>结构体简介
特点:构造类型,可以构造出任何程序员想要的类型。
思考:如何定义一个结构体
struct 结构体名
{
数据类型 成员变量名;
数据类型 成员变量名;
数据类型 成员变量名;
...;
}
struct people
{
int id;
char name[20];
int score;
};
struct people pe;
struct people *p;
struct people p1[2];
------------------------------------------------------------
访问成员的规则:
(1)结构体普通变量通过"."来访问成员,例如:pe.id
(2)结构体指针变量通过"->"来访问成员,例如:p->id
------------------------------------------------------------
<2>结构体三种定义方式
1、先声明,在定义
struct 结构体名
{
数据类型 成员变量名;
数据类型 成员变量名;
数据类型 成员变量名;
...;
};
struct 结构体名 变量名;
2、在声明类型的同时,定义变量
struct 结构体名
{
数据类型 成员变量名;
数据类型 成员变量名;
数据类型 成员变量名;
...;
}变量名列表;
例如:
struct people
{
char name[15];
int age;
int id;
}p1; //p1 是一个结构体变量
========>这里的p1,相当于struct people p1;
p1.age = 20;
p1.id = 15;
3、省略结构体名,直接定义结构体类型的变量
struct
{
数据类型 成员变量名;
...;
}变量名列表:
例如:
struct
{
char name[15];
int age;;
int id
}p1;
特点:只能定义一次,接下来不能再定义结构体变量了。
结构体类型和结构体变量
struct node
{
int a;
}; =========》结构体类型
struct node Linklist; 结构体变量
练习:
大家把我定义的第二种和第三种分别用结构体指针和结构体变量来打印。
#include <stdio.h>
#include <string.h>
struct student
{
int id;
char name[20];
char sex;
}*stu;
struct
{
int id;
char name[20];
char sex;
}p,*q;
int main()
{
struct student s;
stu = &s;
stu->id = 20;
strcpy(stu->name,"jack");
stu->sex = 'm';
printf("id : %d\n",stu->id);
printf("name : %s\n",stu->name);
printf("sex : %c\n",stu->sex);
printf("============================\n");
q = &p;
q->id = 20;
strcpy(q->name,"rose");
q->sex = 'w';
printf("id : %d\n",q->id);
printf("name : %s\n",q->name);
printf("sex : %c\n",q->sex);
return 0;
}
思考:为什么会出现字节对齐这种现象?
因为各个硬件对内存空间的处理不一样。一些特定的平台只能从特定的地址开始。
普通变量的大小
char short int long float double
1 2 4 4 4 8
位置偏移
char short int long float double
1 2 4 4 4 4
结构体成员的存放规则:
<1>结构体成员的相对偏移[成员偏移结构体首地址的字节数] % 本身的位置偏移 == 0,不满足则补齐,直到可以为0
<2>最后结构体的总大小 % 最大成员的位置偏移 == 0,不满足则补齐,直到可以为0
二、共用体(联合体)
思考:什么叫做共用体?
不同数据类型的数据可以使用共同的存放空间,这种数据类型我们叫做共用体。
特点:所用的成员共享同一块内存空间(最大成员变量)。
union 共用体名
{
类型 成员1;
类型 成员2;
...
};
代码如下:
#include <stdio.h>
union stu
{
char a;
int b;
short c;
};
struct s
{
char a;
int b;
short c;
};
int main()
{
struct s s1;
union stu s2;
printf("sizeof(struct) : %d\n",sizeof(s1));
printf("sizeof(union) : %d\n",sizeof(s2));
s1.a = 'c';
s1.b = 10;
s1.c = 45;
printf("s1.a : %c\n",s1.a);
printf("s1.b : %d\n",s1.b);
printf("s1.c : %d\n",s1.c);
printf("========================\n");
s2.a = 'c';
s2.b = 10;
s2.c = 45;
printf("s2.a : %c\n",s2.a