八、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本质也是零,而这个零不代表数字零,而表示的是内存单元的编号零
    计算机规定了以零为编号的存储单元的内容不可读,不可写
相关推荐
死磕音视频9 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
Navigator_Z9 小时前
LeetCode //C - 1291. Sequential Digits
c语言·算法·leetcode
顽疲11 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog11 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
水饺编程12 小时前
第2章:Linux 基础,clear 命令
linux·c语言·汇编
程序喵大人13 小时前
【C++入门】编译链接模型 - 07 链接器怎样把符号对上号
开发语言·c++·编译器·编译链接·链接器
无敌贵点大王13 小时前
嵌入式软件面试经(自用)
c语言·stm32·单片机·学习·mongodb·面试·职场和发展
微三云 - 廖会灵 (私域系统开发)13 小时前
供应链系统实战:多渠道订单聚合与分布式库存一致性方案总结
开发语言·分布式·php
学逆向的14 小时前
C 数据溢出与精度丢失
c语言·开发语言·网络安全
霸道流氓气质14 小时前
AgentFlow 入门与实战:Task-Based 并发、EWMA 动态调度与四道门禁的 Java 生产级编排
java·开发语言