46 重难点
共 7410字,需浏览 15分钟
·
2021-08-03 03:03
点击蓝字
关注我们
DRAGON BOAT FESTIVAL
01 基础部分
标识符的命名规则
1.只能由字母、数字、下划线构成
2.数字不能作为标识符的开头
3.关键字不能作为标识符
三目表达式
表达式1?表达式2:表达式3
先计算表达式1,
若表达式1成立, 则选择计算表达式2,并表达式2的值作为整个大表达式的值;
若表达式1不成立,则选择计算表达式3,并将表达式3的值作为整个大表达式的值
运算
相同数据类型的元素进行数学运算得到结果还保持原数据类型。
不同数据类型的元素进行数学运算,先要统一数据类型,统一的标准是低精度类型转
一维数组的定义、初始化
类型符 数组名 [常量表达式]
类型符是指数组中数组元素的类型;数组名要符合标识符命名规则;
常量表达式是指数组的长度,其值只能是整数,不可以是变量,而且从1开始计数。
数组元素的引用
数组名[下标]
引用数组元素时,[ ]中的下标为逻辑地址下标,只能为整数,可以为变量,且从0开始计数
二维数组的定义、初始化
类型符 数组名 [常量表达式][常量表达式]
二维数组可以看做是矩阵
类型符是指数组中数组元素的类型;
数组名要符合标识符命名规则;
第一个常量表达式是指数组的行数;
第二个常量表达式是指数组的列数;常量表达式的值只能是整数,不可以是变量,而且从1开始计数。
一维数组初始化时可以省略数组长度
二维数组初始化时可以省略行数,但不能省略列数
数组元素的引用
数组名[下标] [下标]
引用数组元素时,[ ]中的下标为逻辑地址下标,只能为整数,可以为变量,且从0开始计数
第一个[下标]表示行逻辑地址下标,第二个[下标]表示列逻辑地址下标。
02 专题:
动态内存分配 (所有高级语言,没有C里深刻)
传统数组的缺点:
1.数组长度必须事先指定,而且只能是常整数,不能是变量
例子
int a[5]; //必须事先指定,而且只能是常整数
int len = 5;
int a[len];//error
2.传统形式定义的数组,该数组的内存程序员无法手动释放
数组一旦定义,系统为数组分配的内存空间就会一直存在,除非数组所在的函数运行终止。
在一个函数运行期间,系统为该函数中的数组分配的空间会一直存在。
直到该函数运行完毕时,数组的空间才会被系统自动释放。
3. 数组的长度一旦定义,数组长度就不能再更改。
数组的长度不能在函数运行的过程中动态的扩充或缩小
4. 传统方式定义的数组不能跨函数使用
A函数定义的数组,只有在A函数运行期间才可以被其他函数使用,
但A函数运行完毕后,A函数中的数组将无法在被其他函数使用。
为什么需要动态分配内存?
很好的解决的了传统数组的4个缺陷
动态内存分配举例_动态数组的构造 难点
1. 要使用malloc函数,必须要添加malloc.h头文件
2. malloc函数只有一个形参,并且形参是整型
3. malloc函数只能返回第一个字节的地址,并且这个地址被强制类型转化成存放整型变量的地址,传达出指向整型 变量的信息
使用动态数组的优点:
1.动态数组长度不需要事先给定;
2.内存空间可以手动释放;
3.在程序运行中,动态内存空间大小可以通过realloc函数手动扩充或缩小
静态内存和动态内存的比较
静态内存是由系统自动分配,有系统自动释放
静态内存是在栈分配的
动态内存是由程序员手动分配,手动释放
动态内存是在堆分配的
跨函数使用内存的问题 难点
目的:跨函数使用内存
函数内的静态空间,不能被其他函数调用访问
内存越界:程序访问了一个不该被访问的内存
函数内的静态空间,不能被其他函数调用访问
函数中的内存空间,随函数终止而被释放。
内存空间释放后的内容不属于其他函数,其他函数无权限访问。
但释放后的内存空间的地址是可以被其他函数读取的。
指针变量可以存贮任何函数中静态内存空间的地址,p都能存垃圾,p想存谁存谁
静态空间是在栈里面分配的,函数终止本质叫做出栈,所以静态空间随着函数终止而释放,动态空间是在堆里面分配 的,与栈无关,与函数终止无关,不随着函数终止而释放。
可以用free()释放
什么是枚举
把一个事物所以可能的取值一一列举出来
枚举的优缺点
优点:代码更安全,比较直观
缺点:书写麻烦
约翰•冯•诺依曼(JohnVonNouma,1903-1957),美藉匈牙利人
计算机之父:2大贡献
二进制
计算机设备分类:运算器 控制器 存储器 输入设备 输出设备
什么是进制
数字是本质,进制只是不同表现方式
一个十六进制位,要用4个二进制数表示,(1)16 = (0001)2 前面补齐
二进制 逢 二进一
十进制 逢 十进一 dec
八进制 逢 八进一 oct 0数字 int i = 05;
十六进制 逢 十六进一 hex 0x数字 0X数字
int i = 0x5;int i = 0X5;
生活中:
七进制 七天进周
十二进制 十二月进年
二十四进制 二十四小时进日
六十进制 六十分钟进小时
六十秒钟进分钟
汇编里
1101B 二进制
1357O 八进制
2049D 十进制
3FB9H 十六进制
十进制(D) 二进制(B) 八进制(O) 十六进制(H)
0 0 0 0
1 1 1 1
2 10 2 2
3 11 3 3
4 100 4 4
5 101 5 5
6 110 6 6
7 111 7 7
8 1000 10 8
9 1001 11 9
10 1010 12 a (A)
11 1011 13 b (B)
12 1100 14 c (C)
13 1101 15 d (D)
14 1110 16 e (E)
15 1111 17 f (F)
16 10000 20 10
017 = 7 + 1*8 = 15
0x17 = 7 + 1*16 = 25
1234 = 4 + 1*10三次方 + 2*10二次方 + 3*10一次方
0x32c = c + 3*16二次方 + 2*16一次方 = 4354
最高幂数是位数-1
原码:也叫符号绝对值
最高位0表示正 1表示负,其余二进制位是该数字的绝对值的二进制位
在计算机中,从未被使用!
反码
反码运行不便,也没有在计算机中应用
移码
表示数值平移n位,n称为移码量
移码主要用于浮点数的阶码的存储
补码 地址是内存单元编号 0到4G-1 2的32次方-1 总线32位,32个0,1
主要解决整数的存储 int 4字节 32位个0,1
已知十进制求二进制
求正整数的二进制
除2取余,直到商为零,余数倒序排列
求负整数的二进制
先求出与该负数相对应的正整数的二进制代码,然后,将所有位取反,末尾加1,不够位数时,左边补一
-5 5 101 010 011 29个1,011
4字节 int(-3) 011 100 101 补29个1,101
2字节 short int(-3) 101 补13个1 101
(-100) 16进制 64(16进制) 0110,0100 反 1001,1011 +1 1001,1100 FFFFFF9C 8位
求零的二进制
全是零
已知二进制求十进制
如果首位是0,则表明是正整数,
按普通方法来求
如果首位是1,则表明是负整数,
将所有位取反,末尾加1,所得数字就是该负数的绝对值
如果全是零,则对应的十进制数字就是零
在在VC++6.0中一个int类型变量所能存储的数字的范围是多少
32位系统,32个0,1组合表示的内存单元,8个十六进制数组合
int类型变量所能存储的最大正数用十六进制表示:7FFFFFFF
int类型变量所能存储的绝对值最大负整数用十六进制表示:80000000
最小负数的二进制代码是多少 1(0-0 31个0)
最大正数的二进制代码是多少 0(1-1 31个1)
已知一个整数的二进制代码求原始的数字 按“已知二进制求十进制”求
不同数据类型转化 丢失最高位.只截取2个数据类型中,所占字节小的位数的值
链表
C语言和数据结构的连接 链表是数据结构第一部分
03 算法:
通俗定义:解题的方法和步骤
狭义定义:对存储数据的操作
对不同的存储结构,要完成某一个功能所执行的操作是不一样的。
比如:
要输出数组中所有的元素的操作 和
要输出链表中所有的元素的操作 是不一样的
这说明:
算法是依附于存储结构的
不同的存储结构,所执行的算法是不一样的
广义定义:广义的算法也叫泛型 C++
无论数据是如何存储的,对该数据的操作都是一样的
分层思想,站在更高的层次看,把内部的实现给屏蔽
数组和链表都是线性的,都是输出一个元素后,再输出下一个元素
数组
优点:存取速度快
缺点:需要一整块连续的空间,插入和删除元素效率很低
链表
优点:插入删除元素效率高
缺点:查找某个位置的元素效率低
链表专业术语:
首结点:存放第一个有效数据的结点
尾结点:存放最后一个有效数据的结点,指针域的指针为NULL,尾结点的标志
头结点:
头结点的数据类型和首结点的类型是一模一样的
头结点是首结点前面的那个节点
头结点并不存在有效数据
设置头结点的目的是为了方便对链表的操作
头指针:存放头结点地址的指针变量
确定一个链表需要一个参数,头指针
球分享
球点赞
球在看