c高级的内容学习了七天左右,最后一天考试复习。c高级总体上看是比c基础难一些,最开始和c基础一样,也是先学习Linux的基础,和c基础不同的是,学习了新的shell命令、软件安装、网络配置和shell脚本等。接着后面学习c语言的灵魂——指针,什么是指针?指针数组、数组指针、指针函数、函数指针等,知识点还是有些让人头大,不过熟能生巧,多多练习就好了,下面就本阶段学习作一个总结。
一、知识点总结
- Linux基础
a.Linux系统的目录结构
/ 根目录 类似于Windows中的C盘 。
/bin 系统的可执行文件命令或可执行程序。
/dev 系统设备文件。
/etc 系统配置文件或服务的目录。
/home 用户的家目录。
/lib 系统库文件目录。
/mnt 系统挂载点目录。
/opt 系统应用程序安装包存放位置类似于Windows中 program files(x86)。
/proc 一个虚拟的文件系统路径,用于查看系统中的 程序运行状态等信息 。
Linux文件系统与Windows文件系统的区别:Linux文件名 严格区分大小写。
b.shell命令
一般格式:命令 [-选项] [参数]
命令取别名:alias 命令别名='命令原动作',如:alias ls='ls --color=auto'
删除别名:un alias 命令别名。
wc 统计命令:用于统计字符或字符串。
wc -w :统计输入的字符串中 字符的个数(使用' '分割的 )。
wc -l :统计输入的字符串中 '\n'的个数即行数 。
grep 命令:用于查找 输入的字符串。
echo:echo "字符串" ,在终端中 输出字符串。
grep:查找字符串。
head:显示文件开头。 //默认10行
tail: 显示文件结尾。 //默认10行
diff: 比较两个文件。
file: 查看文件类型。 //Linux是看文件内容 不是看后缀
echo:显示文本 。 //有点像printf();
date:显示时间和日期。 //显示当前日期
gzip: 压缩文件。
ungzip :解压文件。
usermod:修改用户的属性,-d 修改用户家目录的位置,前提新家目录要存在。
ps -aux :查询当前系统中 有哪些进程在运行。
top:动态显示运行的进程。
kill 命令 :用于发送信号给进程 ,kill -9 PID(编号):发送杀死信号个某个进程。
bg 任务号:让后台暂停的任务继续运行。
fg 任务号:后台的任务切换到前台。
c.shell中的符号
通配符: 使用一些特殊符号代指某些情况或字符。
* 代指匹配任意长度任意字符 。
? 配置任意 1个字符长度的字符 。
[] 选择匹配 1个长度的字符 。
[-] 选择匹配 一定范围的 1个长度字符。 如:[0-9],[a-z]
[^] 选择匹配不是该范围的 1个字符长度。 如:[^0-9],[^a-z]
| 管道符:连接两个命令, 将前一个命令的输出作为下一个命令的输入。
\ 转义符(反斜杠),将原本有特殊意义的转义为正常字符 。
/ 目录分隔符(斜杠) 目录分隔符在shell命令中该符号不能转义。
>,<输入输出重定向符 输出重定向 (>),>:覆盖模式,>>:追加模式,输入重定向(<)
d.软件的安装与卸载
dpkg相关命令:
dpkg -i <package> 安装一个在本地文件系统上存在的Debian软件包。
dpkg -r <package> 移除一个已经安装的软件包。
dpkg -P <package> 移除已安装软件包及配置文件。
dpkg -l <package> 列出安装的软件包清单。
dpkg -s <package> 显出软件包的安装状态。
dpkg -reconfigure <package> 重新配置一个已经安装的软件包。
e.shell脚本
定义:是一种解释性编程语言,将多个shell命令 有序存放于文件中。
shell脚本格式:
1.文件 通常 .sh后缀
2.文件第一行 #!/bin/bash 指定shell解释器
3.给shell脚本 赋值可执行权限
位置变量:
shell脚本在运行时,给定的参数或选项将通过位置变量进行传递,不需要定义 。
$0 shell脚本名及路径
$1 第一个选项或参数
$2 第二个选项或参数
..
$9 第九个选项或参数
预定义变量 :
$# shell脚本执行时参数的个数
$@ 包含所有参数
$* 包含所有参数
$? 是上一个命令执行时 的 退出状态值 (返回值)
字符串测试:
s1 = s2 测试两个字符串的内容是否完全一样
s1 != s2 测试两个字符串的内容是否有差异
-z s1 测试s1 字符串的长度是否为0
-n s1 测试s1 字符串的长度是否不为0
整数测试:
a -eq b 测试a 与b 是否相等
a -ne b 测试a 与b 是否不相等
a -gt b 测试a 是否大于b
a -ge b 测试a 是否大于等于b
a -lt b 测试a 是否小于b
a -le b 测试a 是否小于等于b
文件测试:
-d name 测试name 是否为一个目录
-e name 测试一个文件是否存在
-f name 测试name 是否为普通文件
-L name 测试name 是否为符号链接
-r name 测试name 文件是否存在且为可读
-w name 测试name 文件是否存在且为可写
-x name 测试name 文件是否存在且为可执行
-s name 测试name 文件是否存在且其长度不为0!
f1 -nt f2 测试文件f1 是否比文件f2 更新
f1 -ot f2 测试文件f1 是否比文件f2 更旧
注意:在shell中 默认定义的变量 都是全局变量的,若要定义 局部的变量,使用 local 修饰变量。
2.C语言-指针
a.指针是什么?
指针的含义有两个,一是表示内存的地址,此时它是一个常量,二是表示一个存放内存地址的变量,指针变量。
b.指针变量的定义和含义
定义:存储类型 数据类型 变量名;
如:int *p = &a;定义了一个指针变量p, 该变量将会存储 一个地址,该地址所在的内存是 int类型。
赋值:指针变量 = 地址常量/其他指针变量,通过指针变量赋值与对应的地址建立指向关系。
野指针: 定义时 没有给定初始值,或指向的内存地址不可用。
空指针: 指针变量的值是地址0 即 NULL (void*)0
c.指针的运算
关系运算:
!= 左右两边只能给指针类型 。表示判断这两个指针是否指向同一个内存空间 。
> < >= <= == != 指针之间可以关系运算,表示判断这两个指针位置关系。
指针的算数运算:
指针只能进行有条件的算数运算,两个指针“ - ”在大地址可以减小地址,其表示的物理意义是指这两个指针之间相距的距离,其单位为指针指向的类型,这两个指针指向的内存是连续的 。
指针与整型运算:
指针 “ + ” 或“ + ”一个整数: 其结果是一个对应类型的地址,表示对当前指针(+)或 (-)前方对应个数的类型的地址。
d.指针与数组
数组名可以当指针用,是一个指向元素类型的指针,是一个指针常量,不能进行指针赋值操作,指针变量可以当数组使用,数组的所有操作均可使用
e.指针的各种用法
数组指针: 一个指针指向一个数组 ,&数组名。
如:int arr[5]; int* p = arr;
指针函数 :指一个函数的返回值是一个指针,不能是野指针,返回的该指针应注意不能指向无效或非法的地址 ,通常该指针主要指向静态区、堆区、常量区。
函数指针: 是一个指针变量,指向一个函数的入口地址。
函数类型: int func(int *a,int *b);其类型为 int (int *,int *);则定义函数指针 : int (*p) (int *,int *);
函数指针数组:一个数组其元素是函数指针。
3.C语言-结构体、共用体
a.结构体(struct)
定义:是一种构造数据类型,可以用于存储多个不同类型的数据,在内存中连续存放。
如:
struct 自定义结构体类型名 {
成员列表;
....
};
成员: 一个结构体中的一个数据,称作结构体的一个成员。
结构体定义步骤:(1) 先定义结构体类型 (2)通过该类型定义结构体变量
结构体成员的访问:结构体变量.成员名
结构体指针: 一个指针指向一个结构体首地址。访问:结构体指针 -> 成员名;
结构体数组:一个数组其元素是结构体。
结构体指针数组:一个数组其元素是结构体指针。
b.共用体(union)很少使用
定义:多个不同类型的数据公用同一片内存空间,内存空间的大小以最多的那个类型为准。
如: union 共用体名
{
共用体成员名;
....
};
二、学习心得体会
总的来说,c高级的学习内容普遍难于c基础的内容。以前在学校也学过c语言,但大部分的内容都是c基础的内容,像指针、结构体、共用体等内容完全没有接触,指针又是c语言的灵魂,重点中的重点,难度大于c基础,也可能是之前没有接触指针,所以学习中觉得比较难,但是经过后面的学习,指针也不是想象的那样难。对指针的基本操作是没问题的,但也有有几点不足的地方。
a.写的代码错误太多
在自己的代码中最常见的错误就是“段错误”。编译不会报错,但运行时会报错,查找错误很让人头大。没有一个好的方法查找错误,特别是逻辑上的错误,需要找一个好的方法。
b.错误警告看不懂
自己英语方面确实很差,有些单词不认识,就导致错误或者警告原因看不懂,但是错误多了,也就认识了。哈哈,没想到程序报错还能学习单词。
c.指针运用不够熟练
当需要用指针实现某种功能的时候,我需要花比较多的时间去想该怎么写,然后写出来一堆的错误,打代码还是最好的学习方式,因为只有打代码才能够提升自己的熟练度。