46 重难点

二级C语言必过教程

共 7410字,需浏览 15分钟

 · 2021-08-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,尾结点的标志

    头结点:

    头结点的数据类型和首结点的类型是一模一样的
    头结点是首结点前面的那个节点
    头结点并不存在有效数据
    设置头结点的目的是为了方便对链表的操作

    头指针:存放头结点地址的指针变量

    确定一个链表需要一个参数,头指针




球分享

球点赞

球在看


浏览 24
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报