八、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本质也是零,而这个零不代表数字零,而表示的是内存单元的编号零
    计算机规定了以零为编号的存储单元的内容不可读,不可写
相关推荐
liu****11 分钟前
4.基础开发工具(一)
linux·开发语言·1024程序员节
文火冰糖的硅基工坊11 分钟前
[人工智能-大模型-72]:模型层技术 - 模型训练六大步:①数据预处理 - 基本功能与对应的基本组成函数
开发语言·人工智能·python
小龙报16 分钟前
《C语言疑难点 --- 字符函数和字符串函数专题(上)》
c语言·开发语言·c++·算法·学习方法·业界资讯·visual studio
凭君语未可20 分钟前
深度解析Java的多态特性
java·开发语言
趙小贞27 分钟前
字符设备驱动开发流程与实战:以 LED 驱动为例
linux·c语言·驱动开发
csbysj202031 分钟前
DTD 元素:XML 与 SGML 文档结构解析指南
开发语言
傻童:CPU1 小时前
C语言练习题
c语言·开发语言
极地星光1 小时前
协程:实战与系统集成(高级篇)
开发语言
0和1的舞者1 小时前
《Git:从入门到精通(八)——企业级git开发相关内容》
大数据·开发语言·git·搜索引擎·全文检索·软件工程·初学者
liulilittle1 小时前
LwIP协议栈MPA多进程架构
服务器·开发语言·网络·c++·架构·lwip·通信