1.定义结构体类型的原因
通过以学的东西很难满足我们的需要
没有办法表示这些数据的内在联系,数组只能存放同一类型的数据。
C语言允许用户自己建立有不同类型数据组成的组合型的数据结构,它称为结构体,也可以称为记录。
2.定义
struct 结构体名
{
成员列表
}结构体变量={初始化};
3. struct声明结构体类型的关键字,不能省略
结构体名又可以称为结构体标记
成员可以属于另一个结构体
结构体变量与类型的区别:
只能对变量赋值、存取或运算,而不能对一个类型赋存取或运算。在编译时只对变量分配空间。
成员名可以与变量名相同
“ . ”成员运算符
eg:
typedef struct MyBoyFriend
{
int age;
char *name;
}boy;
void Show(boy *p,int len)
{
for(int i = 0;i < len;i++)
{
printf("%d,%s ",p[i].age,p[i].name);
}
printf("\n");
}
int main()
{
boy bb[2] = {{18,"luhan"},{21,"wuyifan"}};
bb[1].name = "caocao";
int len = sizeof(bb)/sizeof(bb[0]);
Show(bb,len);
return 0;
}
4.课堂笔记
结构体:聚合类型 (不能整体赋值) AAa
定义 struct A{属性}结构体变量;
结构体名(可有可无)
{不能赋初值}
struct A Aa结构体变量
Aa.a=10; 赋值
在c++中空的结构体大小为1 .cpp
c 不支持定义一个空的结构体 .c
typedef给类型取别名 变量提升为类型
typedef int INT
INT a=10;
考点:#define 与typedef, const区别 课件
static extern
->指向符 Bb.b->a = 100;//指向符用的时候,取决于前面的操作数是否为指针类型
. ->
变量访问元素用.
->也相当于解引用->类似(*)
p[i].age
浅拷贝(都变)深拷贝(副本改变而已)
声明不定义变量不占内存
5.重难点:结构体的大小
内存对齐(最大的) 向后对齐
下标除字节 没余数 考虑下次循环同样也要对齐(读取两次)
从里往外看,和最大的对齐
struct A
{
char a;//1+3
int b;//4 内存对齐
};
struct B
{
char a;//1+1
short sh;//2
int b;//4 内存对齐
};
struct C
{
char a;//1+3 0--3
int b;//4 4--7
short c;//2 //8-15
double d;//8
};
struct D
{
char a;//1
char b;//1
short c;//2
int d;//4
};
struct E
{
char a;//1+1
short c;//2
char b;//1+3
int d;//4
};
struct F//向后对齐
{
int a;//4
char b;//1+3
};
struct G
{
char a;//1+3
//char *p;//4
struct H
{
char b;//1+3
float c;//4
}h;//8
};