八、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本质也是零,而这个零不代表数字零,而表示的是内存单元的编号零
    计算机规定了以零为编号的存储单元的内容不可读,不可写
相关推荐
敲代码不忘补水3 分钟前
Python 项目实践:简单的计算器
开发语言·python·json·项目实践
蒟蒻的贤11 分钟前
Web APIs 第二天
开发语言·前端·javascript
ljp_nan19 分钟前
QT --- 初识QT
开发语言·qt
ᅠᅠᅠ@24 分钟前
异常枚举;
开发语言·javascript·ecmascript
凌肖战30 分钟前
力扣上刷题之C语言实现(数组)
c语言·算法·leetcode
编程版小新30 分钟前
C++初阶:STL详解(四)——vector迭代器失效问题
开发语言·c++·迭代器·vector·迭代器失效
c4fx1 小时前
Delphi5利用DLL实现窗体的重用
开发语言·delphi·dll
鸽芷咕1 小时前
【Python报错已解决】ModuleNotFoundError: No module named ‘paddle‘
开发语言·python·机器学习·bug·paddle
Jhxbdks1 小时前
C语言中的一些小知识(二)
c语言·开发语言·笔记
java6666688881 小时前
如何在Java中实现高效的对象映射:Dozer与MapStruct的比较与优化
java·开发语言