结 构 体
1.结构体的定义
struct 结构体名
{
数据类型1 成员变量1;
数据类型2 成员变量2;
数据类型3 成员变量3;
...
数据类型n 成员变量n;
};
2.结构体的初始化
1.有名结构体初始化
1.全部初始化
struct student
{
char name[20];
char sex;
int num;
int score;
};
struct student a = {"zhangsan", 'm', 1001, 60};
2.部分初始化
struct student a = {
.name = "zhangsan",
.num = 1001,
};
3.定义结构体时初始化定义变量
struct student
{
char name[20];
char sex;
int num;
int socre;
}a = {"zhangsan", 'm', 1000, 100};
2.无名结构体初始化
1.全部初始化
struct
{
char name[20];
char sex;
int num;
int score;
}a = {"zhangsan", 'm', 1000, 100};
2.部分初始化
struct
{
char name[20];
char sex;
int num;
int score;
}a = {
.name = "zhangsan",
.sex = 'm',
};
3.结构体的访问
1.通过结构体变量名访问
a.name
a.sex
a.num
a.score
2.通过结构体指针访问
ps->name
ps->sex
ps->num
ps->score
4.结构体成员变量的操作
从终端接收一个学生的姓名、性别、学号、成绩
存放在一个结构体当中,并且在终端上打印除输
入的所有信息
结构体
1.结构体在内存中的存储
1.内存对齐
1.成员变量只能存放在地址为自身
类型基本长度整数倍的内存地址单
元当中
2.结构体类型的长度必须是成员变
量中最大基本类型的整数倍
2.内存中有3中对齐方式
1.字节对齐
2.半字对齐
3.字对齐
共用体
1.概念
共用体内部的成员变量共同使用同一块内存空间
共用体中保存的数据是上次赋值后的成员变量值
2.存储
内存大小端:
内存低地址存放低数据位叫做小端
内存低地址存放高数据位叫做大端
枚举
enum weekday
{
sunday, //0
monday, //1
tuesday, //2
wednesday, //3
thusday, //4
friday, //5
saterday, //6
};
enum weekday day = 0;
指针高级
1.一级指针:指向一个普通变量的指针,保存的是变量
的内存地址编号
2.二级指针:指向一个指针变量的指针,保存的是指针
变量的内存地址编号
3.const 只读类型
1. const int *p;
2. int const *p;
3. int * const p;
4. const int * const p;
5. int const * const p;
1. 1和2属于同一种形式,它们将*p修饰成为只读
类型没有办法通过指针变量p修改对应内存地址
单元中的值,但是可以通过直接使用变量名修改
对应内存单元中的值
2. 3中const修饰指针变量p,此时p必须初始化,否
则将无法改变指针变量p中的值,但是可以利用
指针p改变其对应内存单元中的值
3. 4和5属于同一种形式,他们将*p和p修饰成只读
类型,既没有办法修改p中的值,也没有办法修
改指针变量p对应的内存单元的值,注意定义该
类型指针变量p时,必须初始化
4.void指针
char *p = &ch;
int *q = NULL;
q = p;
不仅能把地址赋值给void型指针,并且还能把指针
的类型赋值给void型指针,所以void型指针既可以
变成char*指针也可以变成int*指针,还可以变成其
余类型的指针
5.数组指针和指针数组
1.数组指针是一个指针,该指针指向一个数组
数组指针占4个字节内存空间,空间中保存的是
一个指向数组的地址
int (*p)[5];
定义了一个数组指针p,p变量占4个字节存储空间,
但是该指针指向一个5个元素的整型数组
2.指针数组是一个数组,该数组中保存的元素都为
指针类型
指针数组的大小由数组元素的个数来决定,每个
元素中保存的值都为一个地址
int *p[5];
定义了一个指针数组,数组名为p,指针数组占
20个自己的连续空间,并且每个元素都保存了
指向一个整型变量的指针
6.数组和指针的关系
1.一维数组和指针的关系
一维数组的数组名就是指向数组第一个元素的
指针
int a[5];
int *p = a;
a[n] = *(a+n) = *(p+n) = p[n]
2.二位数组和指针的关系
行指针
二维数组中,指向每一行的一个指针叫做
行指针
a[0]是指向第一行元素的一个列指针
int a[3][4];
int *p = a[0];
第n行第m个元素
a[n-1][m-1] = *(a[n-1]+m-1) = *(p+(n-1)*总列数+m-1)
二位数组数组名是指向二位数组的一个行指针
该行指针指向第一行的列指针,a+1则指向第二
行的列指针
使用a访问第n行第m个元素
a[n-1][m-1] = *(*(a+n-1)+m-1)
行指针和数组指针的关系
行指针就是指向一个数组的数组指针,只不过
该数组就是二位数组的一行
int a[3][4];
int (*p)[4] = a;
二维数组的数组名是指向第一行元素数组的一
个数组指针
int a[3][4];
int (*p)[4] = a;
int *p = a[0];
int *p = *a;
int *p = &a[0][0];
int (*p)[4] = &a[0];