八、C语言-结构体

七、C语言-指针

八、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.怎么使用结构体变量

赋值和初始化

赋值必须单个赋值,初始化可以整体赋值

定义的同时可以整体赋初值,如果定义完之后,只能单个赋初值

如何取出结构体变量中的每个成员

  1. 结构体变量名.成员名
  2. 指针变量名->成员名(这种方式更常用)
    指针变量名->成员名,在计算机内部会被转化成(*指针变量名).成员名的方式来执行
    所以说这两种方式是等价的
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来执行

  1. 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本质也是零,而这个零不代表数字零,而表示的是内存单元的编号零
    计算机规定了以零为编号的存储单元的内容不可读,不可写
相关推荐
Bruce小鬼3 分钟前
QT文件基本操作
开发语言·qt
2202_754421549 分钟前
生成MPSOC以及ZYNQ的启动文件BOOT.BIN的小软件
java·linux·开发语言
我只会发热16 分钟前
Java SE 与 Java EE:基础与进阶的探索之旅
java·开发语言·java-ee
懷淰メ25 分钟前
PyQt飞机大战游戏(附下载地址)
开发语言·python·qt·游戏·pyqt·游戏开发·pyqt5
hummhumm39 分钟前
第 22 章 - Go语言 测试与基准测试
java·大数据·开发语言·前端·python·golang·log4j
宁静@星空1 小时前
006-自定义枚举注解
java·开发语言
hummhumm1 小时前
第 28 章 - Go语言 Web 开发入门
java·开发语言·前端·python·sql·golang·前端框架
武子康1 小时前
Java-07 深入浅出 MyBatis - 一对多模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据库·sql·mybatis·springboot
珹洺1 小时前
C语言数据结构——详细讲解 双链表
c语言·开发语言·网络·数据结构·c++·算法·leetcode
每天吃饭的羊1 小时前
python里的数据结构
开发语言·python