C语言授课记录(三)

C语言授课记录(三)

    • 导语
    • 动态分配
      • 基本函数
      • 使用方法
    • 二级指针
      • 概念
      • 简易操作
    • 位运算
    • 本学期重难点概括
    • 考试注意事项
    • 后期学习推荐
      • 书籍
        • 初级
        • 中级
        • 高级
      • 网课
      • OJ
    • 参考文献
    • 最后的话

导语

本次授课内容如下:动态分配、二级指针、位运算、内容概述、考试注意事项、后期学习推荐

辅助教材为《C语言程序设计现代方法

动态分配

基本函数

教材P295(右上)

  1. malloc,教材P550(左上)
  2. calloc,教材P535(右上)
  3. realloc,教材P554(左上)

常用malloc,注意,在使用malloc时其返回值为一个void*的指针,在使用的时候注意强制类型转换,并且,在程序申请完内存后需要释放它们,否则产生内存泄露,关于内存泄漏可以了解一下 链接

使用方法

动态分配多用于链表这样的数据结构,当然,教材上也有动态分配数组这样的用法,也可以采用,由于本次考试不涉及链表,在此不对链表进行讲解。

#include 
#include 
int main()
{
     
    int *p=NULL;
    p=(int*)malloc(sizeof(int)*10);
    for(int i=0; i<10; i++)
        scanf("%d",p+i);
    for(int i=0; i<10; i++)
        printf("%d ",*(p+i));
    printf("\n");
    for(int i=0; i<5; i++)
    {
     
        printf("%x ",p);
        p++;
    }
    printf("\n");
    for(int i=0; i<5; i++)//死亡边缘试探
        p--;
    free(p);
    return 0;
}

指针在和动态分配的合作下,可以使编写者获得想要的内存空间大小,可以想想这个在死亡边缘试探的操作原理是什么,但是不建议使用。

二级指针

概念

指针的定义在此不再赘述,一级指针存储的内容为普通变量的地址,而二级指针存储的内容是一个指针的地址,如图。

C语言授课记录(三)_第1张图片
本质上,一级指针和二级指针以及多级指针存储的内容都是地址,只是地址所属变量的类型不同。

简易操作

当然,概念上的理解相对于实际操作更加简单,真正掌握还需要结合实际操作。

二级指针多与动态分配或者修改一级指针相结合,如动态申请二维数组以及二叉树的重建,下面给出样例。

#include 
#include 
int main()
{
     
    freopen("test.txt","r",stdin);
    int**p=NULL;
    p=(int**)malloc(sizeof(int*)*10);
    for(int i=0; i<10; i++)
        p[i]=(int*)malloc(sizeof(int)*10);
    for(int i=0; i<10; i++)
        for(int j=0; j<10; j++)
            scanf("%d",&p[i][j]);
    for(int i=0; i<10; i++)
    {
     
        for(int j=0; j<10; j++)
            printf("%d ",p[i][j]);
        printf("\n");
    }
    return 0;
}

具体内部如图
C语言授课记录(三)_第2张图片
结合代码和图可以看出,二级指针经过一次动态分配后“拥有”了数个一级指针,实质上是获得了一个一级指针数组的首地址,之后再次对指针数组的每一项进行操作,各自申请固定大小,则指针数组的每一项存储的是一个一维数组的首地址

位运算

符号 作用 示例
<< 左移一位 p=2;p<<=1;//p=4
>> 右移一位 p=2;p>>=1;//p=1
~ 按位取反 p=2;p=~p;//p=-3
& 按位与 p=2;p&=1;//p=0
^ 按位异或 p=2;p^=1;//p=3
| 按位或 p=2;p|=1;//p=3

注意:位运算的优先级很低,在使用的时候最好加上括号。

位运算的相关使用方法请参考文末的参考文献,在此不多展开。

本学期重难点概括

  1. 函数
  2. 结构体
  3. 字符串
  4. 文件

考试注意事项

  1. 动态分配记得释放
  2. 文件操作记得写清楚操作用法
  3. 安定情绪,越慌越做不出来
  4. 想调用相关函数的时候思考题目的测试代码是否有相应的头文件
  5. 附录的函数永远是帮助你偷懒的最好的朋友

后期学习推荐

这里给出在学习过程中个人觉得有帮助的相关学习资料,希望能帮到大家。

书籍

书籍当然不仅限于这些,也有其他的选择如《算法竞赛入门经典》、《算法导论》,但因为这些书本人未曾涉猎,所以不作评价。

初级

《C++入门经典》

C语言授课记录(三)_第3张图片
这本书的目标是零基础入门C++,前面有较多的知识和C语言重合,基础不够好的同学可以尝试阅读这本书,基础较强的同学也可以通过这本书大体了解C++。

《啊哈!算法》

C语言授课记录(三)_第4张图片
这本书介绍了许多初级算法,也设计到大二数据结构课程的一部分,代码思路简单易懂,讲解也十分透彻,可以以较小的代价掌握很多算法的浅层应用,可以为后面的课程打下基础。

中级

《数据结构——用C语言描述》

C语言授课记录(三)_第5张图片
这本书对于数据结构的讲解个人认为不如浙大的版本深入,但是读起来比浙大的版本更好理解一些,代码也给出的比较多,可以用来模仿。

《C++ Primer Plus》

C语言授课记录(三)_第6张图片
C++学习中的权威之书,不多评论。

《数据结构(第2版)》(浙江大学)

C语言授课记录(三)_第7张图片
浙大版本的数据结构难度和内容都很丰富,再加上题集与网课的三管齐下,能帮助读者对数据结构有更好的掌握。

高级

《C++ Primer》

C语言授课记录(三)_第8张图片
另一个C++权威,不解释,不适合初学者,建议先看完Plus,如果学完了C++有兴趣可以挑战一下。

《挑战程序设计竞赛》

C语言授课记录(三)_第9张图片
这本书供学有余力的同学选择,毕竟不是所有人都对竞赛感兴趣,也不是所有人都有时间和精力投入到竞赛,里面涉及到了数据结构和算法的知识,以及一些数学上的问题。

网课

  1. 数据结构,浙江大学(和上文的书配套,课程深入浅出,PTA有配套练习)
  2. 数据结构,西北大学(知识点的讲解较简单,更容易理解,但是不够深入,和上文的书配套)
  3. 程序设计与算法(二)算法基础,北京大学(讲解了一些常用的算法,并以例题为辅)

OJ

  1. PTA(难度适中,简单题和难题都有)
  2. 洛谷(阶梯式学习)
  3. LeetCode
  4. 啊哈添柴(知识点分类式学习)
  5. POJ(几乎都是英文,难)
  6. Virtual Judge(同上)

参考文献

  1. 如何理解C指针及二级指针(1)
  2. 如何理解C指针及二级指针(1):二级指针的使用方式
  3. c/c++指针以及二级指针的理解
  4. 位运算——强大得令人害怕
  5. 【技巧总结】位运算装逼指南
  6. 什么是内存泄漏,常见引起引起内存泄漏的原因,及解决办法

最后的话

接受自己优于他人,接受自己劣于他人

你可能感兴趣的:(C语言授课记录2020,算法,指针,c语言)