导图社区 Linux、C语言程序、gcc编译器知识框架笔记
1. Linux简介 Linux是一种自由和开放源码的操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算... 2. Linux介绍 Linux出现于1991年,是由芬兰赫尔辛基大学学生Linus Torvalds林纳斯·托瓦和后来加入的众多爱好者共同开发完成 3. Linux特点 多用户,多任务,丰富的网络功能,可靠的系统安全,良好的可移植性,具有标准兼容性,良好的用户界面,出色的速度性能 开源
编辑于2022-11-07 17:57:04 广东Linux介绍和基本操作
类Unix系统介绍
操作系统的作用
Unix/Linux联系和区别
Unix家族
Linux家族
Linux和Unix的联系
Linux内核及发行版介绍
Unix/Linux开发应用领域
服务器
嵌入式
桌面应用
电子政务
文件系统
Linux目录结构
/:根目录
/bin: /usr/bin: 可执行二进制文件的目录
/lib: /usr/lib: /usr/local/lib:系统使用的函数库的目录
/home:系统默认的用户家目录
/usr/include:头文件所在目录
文件分类
普通文件
目录文件
设备文件
管道文件
链接文件
文件权限
访问用户
文件所有者:只允许用户自己访问
用户组:允许一个预先指定的用户组中的用户访问
其他用户
访问权限
读权限(r)
写权限(w)
可执行权限(x)
常用命令(上)
命令使用方法
Linux 命令格式
查看帮助文档
--help
man手册
使用技巧
文件管理命令
查看文件信息:ls
输出重定向命令:>
分屏显示:more
管道:|
清屏:clear
切换工作目录: cd
显示当前路径:pwd
创建目录:mkdir
删除目录:rmdir
删除文件:rm
建立链接文件:ln
查看文件内容:cat
拷贝文件:cp
移动文件:mv
获取文件类型:file
归档管理:tar
文件压缩解压:gzip
文件压缩解压:bzip2
文件压缩解压:zip、unzip
查看命令位置:which
Linux、C语言程序、gcc编译器知识框架笔记
常用命令(下)
用户、权限管理
查看当前登录用户:whoami
退出登录账户: exit
切换用户:su
添加、删除组账号:groupadd、groupdel
修改用户所在组:usermod
添加用户账号:useradd
设置用户密码:passwd
删除用户:userdel
查询用户登录情况:last
修改文件权限:chmod
字母法:chmod u/g/o/a +/-/= rwx 文件
数字法:“rwx” 这些权限也可以用数字来代替
读取权限,数字代号为 "4"
写入权限,数字代号为 "2"
执行权限,数字代号为 "1"
不具任何权限,数字代号为 "0"
修改文件所有者:chown
修改文件所属组:chgrp
系统管理
查看进程信息:ps
动态显示进程:top
终止进程:kill
后台程序:&、jobs、fg
关机重启:reboot、shutdown、init
字符界面和图形界面切换
Ctrl + Alt + F2:切换到字符界面
Ctrl + Alt + F7:切换到图形界面
查看或配置网卡信息:ifconfig
测试远程主机连通性:ping
vi的使用
基本操作
打开文件
编辑文件
保存文件
实用命令
插入模式
a
光标位置右边插入文字
i
光标位置当前处插入文字
o(小写字母)
光标位置下方开启新行
O(大写字母)
光标位置上方开启新行
I
光标所在行首插入文字
A
光标所在行尾插入文字
退出
ZZ(shift+z+z)
保存退出
:wq
保存退出
:x(小写)
保存退出
:w filename
保存到指定文件
:q
退出,如果文件修改但没有保存,会提示无法退出
:q!
退出,不保存
:!命令
暂时离开vi,执行命令
删除和修改
[n]x
删除光标后 n 个字符
[n]X
删除光标前 n 个字符
D
删除光标所在开始到此行尾的字符
[n]dd
删除从当前行开始的 n 行(准确来讲,是剪切,剪切不粘贴即为删除)
[n]yy
复制从当前行开始的 n 行
p
把粘贴板上的内容插入到当前行
dG
删除光标所在开始到文件尾的所有字符
J
合并两行
.
执行上一次操作
u
撤销前一个命令
行定位
Ctrl + f
向前滚动一个屏幕
Ctrl + b
向后滚动一个屏幕
gg
到文件第一行行首
G(大写)
到文件最后一行行首,G必须为大写
:$
到文件最后一行(行尾)
mG或mgg
到指定行,m为目标行数
/内容
查找指定内容
文本查找
/字符串
查找指定字符串
n
寻找下一个
N
回到前一个
?
寻找上一个
/^字符串
查找以字符串开始的行
/字符串$
查找以字符串结尾的行
/a.b
查找字符串a任意字符b
替换
r
替换当前光标字符
:r 文件名
在光标当前位置载入另一个文件
:s/p1/p2/g
将当前行中所有p1均用p2替代
:g/p1/s//p2/g
将文件中所有p1均用p2替代
:n1,n2s/p1/p2/g
将n1到n2行中所有p1均用p2替代
set指令
:set ic
搜寻时忽略大小写
:set noic
搜寻时不忽略大小写
:set nu
显示行号
:set nonu
不显示行号
远程操作
远程登录
Linux平台相互远程
ssh -l username hostip
-l:选项, 是字母“l”,不是数字“1”
username:被远程登录的用户名
hostip:被远程登录的ip地址
Windows远程登录Linux
xshell
远程传输文件
Linux平台相互传输
本地文件复制到远程
scp FileName RemoteUserName@RemoteHostIp:RemoteFile
本地目录复制到远程
scp -r FolderName RemoteUserName@RemoteHostIp:RemoteFolder
远程文件复制到本地
scp RemoteUserName@RemoteHostIp:RemoteFile FileName
远程目录复制到本地
scp -r RemoteUserName@RemoteHostIp:RemoteFolder FolderName
Windows和Linux相互传输文件
xftp
webserver环境搭建
webserver环境搭建
1、把服务器压缩包(http.tar.gz)放在Linux任意合适目录
2、解压压缩包
3、进入解压后的目录,敲make,编译代码,生成一个myhttp可执行程序
4、启动:sudo ./myhttp start
5、停止:sudo ./myhttp stop
网页版HelloWorld
1、在http文件夹内部编写编译代码
2、编写一个.c代码
3、编译:gcc hello.c -o hello.cgi(后缀一定是.cgi,服务器需要后缀为.cgi)
4、服务器ip/hello.cgi
127.0.0.1/hello.cgi
C语言程序、gcc编译器知识框架笔记
C语言概述
语言发展历程
机器语言
汇编语言和编译器
高级语言
学习C语言理由
第一个C语言程序
include头文件包含
main函数
{} 括号,程序体和代码块
注释
printf函数
return语句
gcc编译器
使用gcc编译C代码
Linux平台下编译代码
gcc hello.c -o hello
Windows平台下编译代码
C语言编译过程
C程序编译步骤
预处理
宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除,这里并不会检查语法
编译
检查语法,将预处理后文件编译生成汇编文件
汇编
将汇编文件生成目标文件(二进制文件)
链接
C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去
分步编译
预处理:gcc -E hello.c -o hello.i
编 译:gcc -S hello.i -o hello.s
汇 编:gcc -c hello.s -o hello.o
链 接:gcc hello.o -o hello_elf
system函数
system函数的使用
system("ls"); //Linux平台, 需要头文件#include <stdlib.h>
system返回值不同系统结果不一样
Qt图形界面调用system
MFC图形界面调用system
汇编语言
VS中C语言嵌套汇编代码
VS反汇编
集成开发环境IDE
Qt Creator
Microsoft Visual Studio
VS2013的C4996错误
数据类型
常量与变量
数据类型
数据类型的作用:编译器预算对象(变量)分配的内存空间大小
sizeof计算一个数据类型的大小
标识符命名规则
标识符不能是关键字
标识符只能由字母、数字、下划线组成
第一个字符必须为字母或下划线
标识符中字母区分大小写
常量
在程序运行过程中,其值不能被改变的量
#define MAX 10 //声明了一个常量,名字叫MAX,值是10,常量的值一旦初始化不可改
const int b = 10; //定义一个const常量,名为叫b,值为10
变量
在程序运行过程中,其值可以改变
变量在使用前必须先定义,定义变量前必须有相应的数据类型
int b = 10; //定义一个变量b,b的类型为int,b赋值为10
进制
二进制
bit(比特)
一个二进制代表一位,一个位只能表示0或1两种状态
Byte(字节)
计算机中存储的最小单位是字节
八进制
以数字0开始表明该数字是八进制
八进制一位对应二进制三位
十六进制
它由0-9,A-F组成,字母不区分大小写
十六进制一位对应二进制四位
C语言如何表示相应进制数
十进制
以正常数字1-9开头,如123
八进制
以数字0开头,如0123
十六进制
以0x开头,如0x123
二进制
C语言不能直接书写二进制数
如果在printf中输出一个十进制数那么用%d,八进制用%o,十六进制是%x
计算机内存数值存储方式
原码
最高位做为符号位,0表示正,为1表示负
其它数值部分就是数值本身绝对值的二进制数
反码
对于正数,反码与原码相同
对于负数,符号位不变,其它部分取反(1变0,0变1)
补码
对于正数,原码、反码、补码相同
对于负数,其补码为它的反码加1
补码符号位不动,其他位求反,最后整个数加1,得到原码
补码的意义
在计算机系统中,数值一律用补码来存储
统一了零的编码
将减法运算转变为加法运算
有符号数和无符号数区别
有符号数是最高位为符号位,0代表正数,1代表负数
无符号数最高位不是符号位,而就是数的一部分,无符号数不可能是负数
整型:int
整型变量的定义和输出
%d
输出一个有符号的10进制int类型
%o(字母o)
输出8进制的int类型
%x
输出16进制的int类型,字母以小写输出
%X
输出16进制的int类型,字母以大写写输出
%u
输出一个10进制的无符号数
整型变量的输入
int a; scanf("%d", &a);
short、int、long、long long
short(短整型)
占2字节
int(整型)
占4字节
long(长整形)
Windows占4字节,Linux32位系统为4字节,64位系统占8字节
long long(长长整形)
占8字节
字符型:char
在给字符型变量赋值时,需要用一对英文半角格式的单引号(' ')把字符括起来
char ch = 'a';
char的本质就是一个1字节大小的整型
字符变量的输入
char ch; scanf("%c", &ch);
转义字符
\n
换行(LF) ,将当前位置移到下一行开头
\t
水平制表(HT) (跳到下一个TAB位置)
\0
数字0
数值溢出
符号位溢出会导致数的正负发生改变
char ch = 0x7f + 2; //127+2 printf("%d\n", ch);//结果为-127
最高位的溢出会导致最高位丢失
unsigned char ch2; ch2 = 0xff+1; //255+1 printf("%u\n", ch2);//结果为0
实型(浮点型):float、double
float a = 3.14f; //或3.14F printf("a = %f\n", a);
double b = 3.14; printf("b = %lf\n", b);
类型限定符
extern
声明一个变量,extern声明的变量没有建立存储空间。
const
定义一个常量,常量的值不能修改。
volatile
防止编译器优化代码
register
定义寄存器变量,提高效率。register是建议型的指令,而不是命令型的指令,如果CPU有空闲寄存器,那么register就生效,如果没有空闲寄存器,那么register无效
字符串格式化输出和输入
printf函数和putchar函数
printf是输出一个字符串
putchar输出一个char
scanf函数与getchar函数
getchar是从标准输入设备读取一个char
scanf通过%转义的方式可以得到用户通过标准输入设备输入的数据
运算符、程序流程结构
运算符与表达式
常用运算符分类
算术运算符
用于处理四则运算
赋值运算符
用于将表达式的值赋给变量
比较运算符
用于表达式的比较,并返回一个真值或假值
逻辑运算符
用于根据表达式的值返回真值或假值
位运算符
用于处理数据的位运算
sizeof运算符
用于求字节数长度
运算符优先级
类型转换
隐式转换
编译器自动转换
强制转换
用户显式转换:(类型)变量名
程序流程结构
顺序结构
选择结构
if语句
if…else语句
if…else if…else语句
三目运算符?:
switch语句
循环结构
while语句
do…while语句
for语句
嵌套循环
跳转语句
break
跳出当前的switch语句
跳出当前的内循环语句,跳出整个循环
continue
只能用于循环语句,跳出本次循环,下一次继续执行
goto
不是循环语句的专属,无条件跳转,不建议滥用
数组和字符串
一维数组
一维数组的定义和使用
数组名字符合标识符的书写规定
{}内数组名不能与其它变量名相同,同一作用域内是唯一的
方括号[]中常量表达式表示数组元素的个数
int a[3]表示数组a有3个元素
其下标从0开始计算,因此3个元素分别为a[0],a[1],a[2]
定义数组时[]内最好是常量,使用数组时[]内即可是常量,也可以是变量
一维数组初始化
定义同时赋值叫初始化,只能在定义时才能通过{}初始化
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
前3个元素初始化,后面的自动填0
int a1[10] = {1, 2, 3};
把每个元素都设置为0
int a2[10] = {0};
根据初始化元素个数来确定数组大小
int a3[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
数组名
数组名是常量,不允许修改的
数组名是第0个元素(首元素)地址
强化训练
一维数组的最值
一维数组的逆置
冒泡法排序
二维数组
二维数组的定义和使用
int a[3][4]
1、定义一个一维数组,这个数组有3元素(3行),第一个[]数字代表元素个数
2、每一个元素都是int [4],每个元素都是一维数组
3、a[0], a[1], a[2]分别代表第0个元素,第1个元素,第2个元素,它是每一个元素数组名
4、操作二维数组的元素(用户角度),理解为多少行多少列
二维数组初始化
二维数组名
多维数组
三维数组就是有n个二维数组
int a[3][2][3]
所谓的n维数组就是有n个n-1维数组
字符数组与字符串
字符串和字符数组关系
字符串是以数字0或者字符'\0'结尾
如果字符数组,以数字0或者字符'\0'结尾,那么这个字符数组就是字符串
字符数组初始化
char buf1[] = {'c', ' ', 'p', 'r', 'o', 'g' };
char buf2[] = {'a', 'b', 'c', '\0'};
char buf3[] = {'a', '\0', 'b', 'c', '\0'};
char buf4[] = "hello";
char buf5[100] = "hello";
字符串的输入输出
产生随机数
设置随机种子:srand((unsigned int)time(NULL));
获取随机数:rand();
函数
字符串常用处理函数
字符串输入
gets()
fgets()
字符串的输出
puts()
fputs()
获取字符串长度(需要使用返回值)
strlen()
字符串拷贝
strcpy()
strncpy()
字符串追加(连接)
strcat()
strncat()
字符串大小比较
strcmp()
strncmp()
格式化输出字符串
printf()
sprintf()
格式化输入字符串
scanf()
sscanf()
字符串查询(需要使用返回值)
strchr()
strstr()
字符串切割(需要使用返回值)
strtok()
字符串转整型(需要使用返回值)
atoi()
atof()
atol()
自定义函数
函数定义和调用的关系
函数只有调用了,才会跳入函数定义的代码
自定义函数
无参无返回值的函数
有参无返回值的函数
无参有返回值的函数
return关键字和exit()函数区别
return关键字是中断函数
return中断main()函数程序结束,return中断其它函数,程序不结束
exit()函数功能为中断整个程序
函数的定义和声明
分文件(多文件)编程
防止头文件重复包含
指针(上)
指针基础知识
指针变量的定义和使用
指针也是一种数据类型,指针变量也是一种变量
指针变量指向谁,就把谁的地址赋值给指针变量
“*”操作符操作的是指针变量指向的内存空间
通过指针间接修改变量的值
指针大小
在32位平台,所有的指针(地址)都是32位(4字节)
在64位平台,所有的指针(地址)都是64位(8字节)
野指针和空指针
野指针不会直接引发错误,操作野指针指向的内存区域才会出问题
C语言中,可以把NULL赋值给此指针,这样就标志此指针为空指针,没有任何指针
万能指针void *
void *指针可以指向任意变量的内存空间
const修饰的指针变量
指向常量的指针
const int *p1 = &a; //等价于int const *p1 = &a;
指针常量
int * const p2 = &a;
多级指针
指针和数组
数组名
数组名字是数组的首元素地址,但它是一个常量
指针法操作数组元素
指针加减运算
加法运算
指针计算不是简单的整数相加
如果是一个int *,+1的结果是增加一个int的大小
如果是一个char *,+1的结果是增加一个char大小
减法运算
指针数组
指针数组,它是数组,数组的每个元素都是指针类型
int *p[3]
指针(下)
指针和函数
指针做函数参数
值传递:形参的修改不会影响到实参
地址传递:形参的修改影响到实参
数组名做函数参数
数组名做函数参数,函数的形参会退化为指针
void printArrary(int a[10], int n) void printArrary(int a[], int n) void printArrary(int *a, int n)
指针做为函数的返回值
int *func();
指针和字符串
字符指针
字符指针做函数参数
const修饰的指针变量
指针数组做为main函数的形参
main函数是操作系统调用的,第一个参数标明argv数组的成员数量,argv数组的每个成员都是char *类型
argc代表命令行参数的数量,程序名字本身算一个参数
argv是命令行参数的字符串数组
项目开发常用字符串应用模型
strstr中的while和do-while模型
两头堵模型
字符串反转模型(逆置)
指针小结
int i
定义整形变量
int *p
定义一个指向int的指针变量
int a[10]
定义一个有10个元素的数组,每个元素类型为int
int *p[10]
定义一个有10个元素的数组,每个元素类型为int*
int func()
定义一个函数,返回值为int型
int *func()
定义一个函数,返回值为int *型
int **p
定义一个指向int的指针的指针,二级指针
内存管理
作用域和生命周期
普通局部变量
属于某个{},在{}外部不能使用此变量,在{}内部是可以使用
执行到普通局部变量定义语句,才会分配空间,离开{},自动释放
普通局部变量不初始化,默认值为随机数
static局部变量
属于某个{},在{}外部不能使用此变量,在{}内部是可以使用
在编译阶段就已经分配空间,初始化只能使用常量
static局部变量不初始化,默认值为0
离开{},static局部变量不会释放,只有整个程序结束才释放
普通全局变量
在编译阶段分配空间,只有整个程序结束才释放
普通全局变量只要定义了,任何地方都能使用,使用前需要声明
所有的.c文件,只能定义一次普通全局变量,但是可以声明多次(外部链接)
static全局变量
在编译阶段分配空间,只有整个程序结束才释放
static全局变量只能在定义所在的文件中使用此变量(内部链接)
不同的.c文件,可以定义一次static全局变量
extern函数和static函数的区别
extern函数所有文件都是调用,所有文件只能出现一次extern函数定义
static函数只能在定义所在的文件中调用此函数,不同文件,可以定义一次static函数
内存布局
内存分区
text(代码区)
函数,只读
data(数据区)
初始化的数据:全局变量,static变量,文字常量(只读)
bss
未初始化的数据:全局变量,static变量
heap(堆区)
由用户手动申请和释放(malloc, free)
stack(栈区)
程序自动申请空间自动释放,非static局部变量
内存操作函数
memset()
memcpy()
memmove()
memcmp()
堆区内存的分配和释放
malloc
free
内存分区代码分析
复合类型
结构体
基本操作
结构体类型定义
结构体变量的定义和初始化
struct Stu obj = {18, "mike", 59};
结构体成员变量的使用
如果是普通变量,点运算符
obj.age = 18;
如果是指针变量,->
(&obj)->age = 28;
指针变量
指针变量指向栈区
指针变量指向堆区
const修饰的指针变量
const struct Stu *p;
struct Stu * const p;
const struct Stu * const p;
结构体数组
结构体和函数
结构体套一级指针
栈区结构体
堆区结构体
共用体(联合体)
共用体,所有成员共用一段内存空间
所有成员的首地址是一样的
共用体的大小为最大成员的大小
改变一个成员,会影响到另外的成员
枚举
将变量的值一一列举出来,变量的值只限于列举出来的值的范围内
enum Color{red, blue, green, black, white};
typedef
作用:给一个以存在的类型起一个别名
typedef int int64;
typedef不能创造新类型
文件(上)
分类
设备文件
标准输入设备
标准输出设备
标准出错设备
磁盘文件
文本文件
二进制文件
文件的打开和关闭
文件指针
FILE *fp
文件的打开
fopen()
r: 以只读方式打开文件,文件不存在出错
w: 以只写方式打开文件,文件不存在则创建,存在清空内容
a: 以追加方式打开文件,文件不存在则创建,文件存在光标放在最后
关闭文件
fclose()
文件的顺序读写
文件操作流程
1、打开文件fopen()
2、文件读或写操作
3、关闭文件fclose()
按照字符读写文件
写文件
int fputc(int ch, FILE * stream);
文件结尾
EOF表示文本文件结束符(end of file)
int feof(FILE * stream);
读文件
int fgetc(FILE * stream);
按照行读写文件
写文件
int fputs(const char * str, FILE * stream);
读文件
char * fgets(char * str, int size, FILE * stream);
文件(下)
文件的顺序读写
按照格式化文件
写文件
int fprintf(FILE * stream, const char * format, ...);
读文件
int fscanf(FILE * stream, const char * format, ...);
按照块读写文件
写文件
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
读文件
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
文件的随机读写
int fseek(FILE *stream, long offset, int whence);
long ftell(FILE *stream);
void rewind(FILE *stream);
Windows和Linux文本文件区别
获取文件状态
int stat(const char *path, struct stat *buf);
删除文件、重命名文件名
int remove(const char *pathname);
int rename(const char *oldpath, const char *newpath);
文件缓冲区
Qt介绍和IDE
Qt介绍
应用程序的创建
构造和析构函数
构造:初始化对象的成员变量
析构:对象结束前做一些清理工作
Qt字符串处理
字符编码
把UTF8转化为GBK
codec->fromUnicode()
把GBK转化UTF8
codec->toUnicode()
QString的使用
QString和char *转换
QString常用操作
字符串匹配子串替换
字符串累加
格式化字符串
字符串清空
IDE案例
ui界面的设计
文件
新建文件
打开文件
保存文件
退出程序
编辑
撤销
拷贝
粘贴
剪切
构建
编译代码
编码
utf-8
gbk
核心功能的实现
打开文件
1、选择一个文件
2、将选择的文件路径编码转换为gbk编码
3、打开文件fopen()
4、循环读取文件内容,每一次读取一行fgets()
5、把读取文件的内容显示到对应的编辑区
6、关闭文件fclose()
保存文件
1、选择一个文件保存路径
2、将选择的文件路径编码转换为gbk编码
3、打开文件fopen()
4、获取编辑区内容
5、将编辑区的内容写入指定的文件中fputs()
6、关闭文件fclose()
编译代码
1、判断文件路径是否有效
2、根据需求处理字符串:"gcc hello.o -o hello"
3、通过system()调用gcc命令完成编译功能
编码选择
以utf-8编码显示中文
以gbk编码显示中文
快译通
指针和函数的结合使用
一级指针做函数参数
二级指针做函数参数
快译通核心代码分析
1、读取文件内容
2、将读取的内容存放在堆区内存中
3、根据需要从堆区查询单词
4、释放堆区空间
Qt版快译通
ui界面的设计
行编辑:QLineEdit
按钮:QPushButton
标签:QLabel
代码分文件
Qt版快译通
1、在按钮的处理函数做相应处理
2、获取编辑区的内容
3、将内容编码转换为gbk编码
4、调用查询函数
5、查询信息显示到标签中