• 20145326蔡馨熠《信息安全系统设计基础》第12周学习总结


    20145326蔡馨熠《信息安全系统设计基础》第12周学习总结

    教材学习内容总结

    视频学习与实践

    指针与声明

    C语言中变量的声明包括两个部分:

    • 类型

    • 声明符

    对于简单类型,声明并不会对代码产生多大的阅读障碍,而对于复杂类型的识别,可以采用右左右左法进行判断。

    指针数组、数组指针、指针函数、函数指针的区别

    数组指针(也称行指针)

    定义 int (*p)[n];

    • ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。

    • 如要将二维数组赋给一指针,应这样赋值:

      int a[3][4];
      int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。

      p=a;//将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
      p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]

    所以数组指针也称指向一维数组的指针,亦称行指针。

    指针数组

    定义 int *p[n];

    • []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 p=a; 这里p表示指针数组第一个元素的值,a的首地址的值。
    • 如要将二维数组赋给一指针数组:
      int *p[3];
      int a[3][4];
      p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针
      for(i=0;i<3;i++)
      p[i]=a[i]

    这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2] 所以要分别赋值。

    • 这样两者的区别就豁然开朗了,数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。
    • 还需要说明的一点就是,同时用来指向二维数组时,其引用和用数组名引用都是一样的。

    • 比如要表示数组中i行j列一个元素: (p[i]+j)、(*(p+i)+j)、((p+i))[j]、p[i][j],优先级:()>[]>

    函数指针

    • 在C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址.我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数.然后通过指针变量就可以找到并调用这个函数.我们把这种指向函数的指针变量称为“函数指针变量”.

    • 函数指针变量定义的一般形式为:

    类型说明符 (*指针变量名)();

    • 其中“类型说明符”表示被指函数的返回值的类型.“(* 指针变量名)”表示“”后面的变量是定义的指针变量.最后的空括号表示指针变量所指的是一个函数.
      例如: int (pf)();
      表示pf是一个指向函数入口的指针变量,该函数的返回值(函数值)是整型.

    指针函数

    • 函数类型是指函数返回值的类型.在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数.
    • 定义指针型函数的一般形式为:
      类型说明符 函数名(形参表) 

      …… /函数体*/
      }
    • 其中函数名之前加了“”号表明这是一个指针型函数,即返回值是一个指针.类型说明符表示了返回的指针值所指向的数据类型.
      如:
      int ap(int x,int y) {
      ./函数体/
      }
      表示ap是一个返回指针值的指针型函数,它返回的指针指向一个整型变量.

    右左右左法

    • 具体方法:

    1.从变量名开始,先右再左地,交替地一个一个向外看,在纸上写下:“变量是”

    2.若向右遇到左圆括号,在纸上写下:“函数,参数是”,并用同样的方法处理括号中每一个参数——在纸上写下:“返回”

    3.若向右遇到方括号,在纸上写下:“数组,长度为{方括号的内容},元素类型为”

    4.若向右遇到右圆括号,什么也不做

    5.若向左遇到*,在纸上写下:“指针,指向”

    6.若向左遇到任何类型,在纸上写下对应的类型名

    比如:int (*func[5])(int *p);

    • func右边是一个[]运算符,说明func是一个具有5个元素的数组,func的左边有一个*,说明func的元素是指针,要注意这里的*不是修饰fun的,而是修饰func[5]的,原因是[]运算符的优先级比*高,func先跟[]结合,因此*修饰的是func[5].跳出这个括号,看右边,也是一对圆括号,说明func数组的元素是函数类型的指针,它指向的函数具有int*类型的形参,返回值类型是int。

    信号的产生

    • 由用户产生,如:Ctrl+C产生SIGINT信号等,可以通过stty -a查看哪些按键可以产生信号
    • 由硬件产生,如:当前进程执行了除以0的指令
    • 由进程发送,如:可在shell进程下,使用命令 kill -信号标号 PID,向指定进程发送信号。
    • 由内核产生,如:闹钟超时产生SIGALRM信号。

    信号的三种处理方式:

    • 忽略
    • 默认处理方式:操作系统设定的默认处理方式
    • 自定义信号处理方式:可自定义信号处理函数

    捕捉信号

    • 利用命令man -k signal进行检索相关函数:

    • sigdemo1.c运行结果如下图所示:

    • 分析:signal函数每次设置具体的信号处理函数(非SIG_IGN)只能生效一次,每次在进程响应处理信号时,随即将信号处理函数恢复为默认处理方式

    忽略信号

    • sigdemo2.c运行结果如下图所示:

    • 查看SIG_IGN宏变量:

    • 由图可知,SIG_IGN是忽略信号的处理程序,表示无返回值的函数指针,指针值为1.

    默认信号

    • 查看SIG_DFL宏变量:

    • 由图可知,SIG_DFL是默认信号的处理程序,表示无返回值的函数指针,指针值为0

    • sigdemo2.c代码如下所示:

    • 如果把SIGIGN改成SIGDFL时,运行结果变成如下所示

    • 分析:SIG_IGN是忽略信号,也就是当键盘输入一个Ctrl+C中断指令时,程序会将其忽略,而改成SIG_DFL后,恢复成了默认的状态,输入中断指令后,自然程序也就中断了。

     

    心得体会

    本周主要学习了视频内容,复习了第九、十、十一周的代码。我发现好多东西虽然学过了,但是过段时间就会忘记,所以复习是很必要的!之前由于每周的学习任务都比较重,所以有些代码没有更细致的去理解分析,这周的时间正好可以拿来复习巩固之前学过的东西,正所谓“温故而知新,可以为师矣”,通过不断温习,之前的基础也会更加扎实!

    学习进度条

      代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时  
    第一周 0/0 1/2 20/20  
    第二周 58/58 1/3 20/40  
    第三周 150/208 1/4 22/62  
    第五周 150/358 1/5 21/83  
    第六周 136/494 1/6 25/108  
    第七周 115/609 2/8 24/132  
    第八周 0/609 2/10 22/154  
    第九周 109/718 3/13 20/174  
    第十周 472/1190 1/14 21/195  
    第十一周 1883/3073 3/17 21/216  
    第十二周 0/3073 2/19 20/236  
  • 相关阅读:
    Linux添加PATH,即命令自动补全功能
    编程的奥义
    Windows SDK笔记
    一个烂电源,毁了我一天的工作
    贪念
    VC菜菜鸟创建一个即时串口通信程序
    IP视频监控系统开放式平台的5个标志
    敷铜的入门
    解决:Ulead VideoStudio 启动黑屏的问题
    数据结构中,关于“大小端”的数据存储方式的相关问题
  • 原文地址:https://www.cnblogs.com/cxy1616/p/6130919.html
Copyright © 2020-2023  润新知