八、C语言-结构体
1.为什么需要结构体
为了表示一些复杂的事物,而普通的基本类型无法满足实际要求
2.什么叫结构体
把一些基本类型数据组合在一起形成新的复合数据类型,这个叫做结构体
3.如何定义一个结构体
三种方式
方式1
c
struct Student //定义一个数据类型,不是变量
{
int age;
float score;
char sex;
}; //记得加分号
方式2
c
struct Student2
{
int age;
float score;
char sex;
} st2; //定义类型的同时,指定变量名,不好,只能定义一次
方式3
c
struct
{
int age;
float score;
char sex;
} st3;
推荐使用第一种
4.怎么使用结构体变量
赋值和初始化
赋值必须单个赋值,初始化可以整体赋值
定义的同时可以整体赋初值,如果定义完之后,只能单个赋初值
如何取出结构体变量中的每个成员
- 结构体变量名.成员名
- 指针变量名->成员名(这种方式更常用)
指针变量名->成员名,在计算机内部会被转化成(*指针变量名).成员名的方式来执行
所以说这两种方式是等价的
c
例子:
struct Student
{
int age;
float score;
char sex;
};
int main(void)
{
struct Student st1 = {80, 66.6, 'F'};//初始化,定义的同时赋初值
struct Student st2;
struct Student *pst = &st2;//pst可以存放struct Student类型变量的地址
st2.age = 10; //第一种方式
pst->age = 88;//第二种方式
return 0;
}
1.pst->age在计算机内部会被转化成(*pst).age,没有为什么,这就是->的含义,这是一种硬性规定
2.所以pst->age等价于(*pst).age也等价于st.age
3.我们之所以知道pst->age等价于st.age,是因为pst->age被转化成了(*pst).age来执行
- pst->age的含义:
Pst所指向的那个结构体变量中的age这个成员
结构体变量和结构体变量指针作为函数参数传递的问题
推荐使用结构体指针变量作为函数参数来传递
结构体变量的运算
结构体变量不能相加,不能相减,也不能相除
可以相互赋值
例如:
c
struct Student st1,st2;
st1 = st2;
5.枚举
什么是枚举
把一个数所有可能的取值一一列举出来
怎么样使用枚举
cpp
enum WeekDay
{
MonDay, TuesDay, WednesDay, ThursDay, SaturDay, SunDay
};
int main(void)
{
enum WeekDay day = WednesDay;
printf("%d\n", day);
return 0;
}
枚举的优缺点
优点:使代码更安全
书写麻烦
6.进制转化
什么是进制
N进制:逢N进一
十进制转r进制
方法:除r取余,直至商为零,余数倒序排列
R进制转成0进制
7.补码
原码
也叫符号-绝对值码
最高位0表示正 1表示负,其余二进制是该数字的绝对值的二进制位
原码简单易懂
加减运算复杂
存在加减乘除四种运算,增加了CPU复杂度
零的表示不唯一
反码
反码运算不便,也没有在计算机中使用
移码
移码表示数值平移n位,n称为移码量
移码主要用于浮点数的阶码的存储
补码
已知十进制求二进制
- 正整数转二进制:除2取余,直至商为零,余数倒序排序
- 负整数转二进制:先求与该负数相对应的正整数的补码,然后将所有位取反,末尾加1,不够位数时,左边补1
- 零的二进制:全零
已知二进制求十进制
- 如果首位是0,则表明是正整数,按普通方法来求
- 如果首位是1,则表明是负整数,将所有位取反,末尾加1,所得数字就是该负数的绝对值
- 如果全是零,对应的十进制数字就是零
- N位二进制代表的整数范围:
一个int型变量所能存储的数字的范围是多少
- int类型变量所能存储的最大整数用十六进制表示:7FFFFFFF
- int类型变量所能存储的绝对值最大的负整数用十六进制表示是:80000000
8.位运算符
- & --按位与
- | --按位或
- ~ --按位取反
- ^ --按位异或
- << -- 按位左移
I <<3表示将i的二进制位左移3位,右边补零
左移n位相当于乘以2的n次方
面试题:
I= I * 8;
I = I << 3;
上述语句2运行速度快 -
--按位右移
I >> 3表示把i的所有二进制位右移3位,左边一般是0,当然也可能补1
右移n位相当于除以2的n次方,前提是数据不能丢失
位运算的现实意义
通过位运算符我们可以对数据的操作精确到每一位
- 二进制全部为零的含义 --000000000的含义
1.数值零
2.字符串结束标记符"\0"
3.空指针NULL
NULL本质也是零,而这个零不代表数字零,而表示的是内存单元的编号零
计算机规定了以零为编号的存储单元的内容不可读,不可写