八、C语言-结构体

七、C语言-指针

八、C语言-结构体

1.为什么需要结构体

为了表示一些复杂的事物,而普通的基本类型无法满足实际要求

2.什么叫结构体

把一些基本类型数据组合在一起形成新的复合数据类型,这个叫做结构体

3.如何定义一个结构体

三种方式

方式1

struct Student //定义一个数据类型,不是变量
{
    int age;
    float score;
    char sex;
}; //记得加分号

方式2

struct Student2
{
    int age;
    float score;
    char sex;
} st2; //定义类型的同时,指定变量名,不好,只能定义一次

方式3

struct 
{
    int age;
    float score;
    char sex;
} st3;
推荐使用第一种

4.怎么使用结构体变量

赋值和初始化

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

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

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

结构体变量和结构体变量指针作为函数参数传递的问题

推荐使用结构体指针变量作为函数参数来传递

结构体变量的运算

结构体变量不能相加,不能相减,也不能相除
可以相互赋值
例如:

struct Student st1,st2;
st1 = st2;

5.枚举

什么是枚举

把一个数所有可能的取值一一列举出来

怎么样使用枚举

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位二进制代表的整数范围:
    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本质也是零,而这个零不代表数字零,而表示的是内存单元的编号零
    计算机规定了以零为编号的存储单元的内容不可读,不可写
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值