导图社区 linux与C
这是一篇关于linux与C的思维导图,包括:C语言开发环境、C语言增强之数组、C语言增强之指针、结构体和共用体四部分内容。
编辑于2022-05-07 21:14:17linux与C
C语言开发环境
一、GCC编译器
1.GCC编译器
(1)GCC编译器的选项
-c :在编译阶段使用,将汇编文件编译成二进制文件 -o :指定生成目标的文件名,若不指定,则生成默认文件名a.out -g :使用gdb调试工具调试代码,需要使用-g编程代码 -O:对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、链接过 程 中进行优化处理,这样产生的可执行文件的执行效率可以提高, 但是,编译、连接的速度就相对来说慢一些 -O2 :比较-O更好的优化编译、连接,当然整个编译连接过程会更慢 -Wall :显示所有警告
(2)GCC编译流程
分4步: 1---预处理(#):主要进行宏替换以及头文件的包含展开 gcc -E hello.c -o hello.i 2---编译:编译生成汇编文件,并检查语法是否有错误 gcc -S hello.i -o hello.s 3---汇编:将汇编文件编译生成目标文件(二进制文件) gcc -c hello.s -o hello.o 4---链接:链接库函数,生成可执行文件 gcc hello.o -o hello 一般编译: gcc *.c 生成a.out的可执行文件 gcc *.c -o * 可以指定生成的可执行文件的名字
2.GCC调试工具
1、还可以调试a.out(可执行文件)gcc -g *.c
2、选项 查看文件 :(list) ------(gdb)l---默认一次显示10行 设置断点(break) ---- (gdb)b 行数 删除断点 (delete) ----(gdb)del 1删除第一个断点 查看断点情况 info ------(gdb)info b 运行代码 (run)------(gdb)r 查看变量值(pintf)------(gdb)p n(变量名) 单步运行 (next step)------(gdb)n ------(gdb) s 回复程序运行(continue) ------(gdb)c 帮助 (help) ------(gdb)help [command] 退出 (quit) ------(gdb)q
二、GDB调试工具
1、还可以调试a.out(可执行文件)gcc -g *.c
2、选项 查看文件 :(list) ------(gdb)l---默认一次显示10行 设置断点(break) ---- (gdb)b 行数 删除断点 (delete) ----(gdb)del 1删除第一个断点 查看断点情况 info ------(gdb)info b 运行代码 (run)------(gdb)r 查看变量值(pintf)------(gdb)p n(变量名) 单步运行 (next step)------(gdb)n ------(gdb) s 回复程序运行(continue) ------(gdb)c 帮助 (help) ------(gdb)help [command] 退出 (quit) ------(gdb)q
C语言增强之数组
一、概念
构造数据类型之一 数组是具有一定顺序关系的若干个变量的集合,组成数组的各个变量称为数组的元素 数组中各元素的数据类型要求相同,用数组名和下标确定 数组可以是一维的也可以是多维的 数组就是研究一组相同类型的数据
二、一维数组的定义
一维数组是指只有一个下标的数组 一般形式: <存储类型> <数据类型> <数组名>[数组元素的个数] 存储类型:auto、register、static、extern 一般省略不写,默认就是auto eg: int a[5]; 注意: []用于定义数组和使用数组的元素,必须使用中括号,在C语言中,[]只在数组中使 用 数组名的命名规则要满足标识符的三条原则 获取数组的每一个元素时,从0开始,a[0] a[1] a[2]
三、一维数组的引用
数组必须先定义,后使用 只能逐个引用数组元素,不能一次引用整个数组 数组元素的表示方式: 数组名[下标] //数组名是一个地址常量,数组的首地址(数组第一个元素的起始地址) //既然数组名是一个地址常量,则不能修改存储的值 //a++是错误的
四、一维数组的初始化
数组不初始化,其元素的值为随机值 对static数组元素不赋初值,系统会自动赋0 只给部分数组元素初始化,其他的为0 当全部数组元素都赋初始值时,可以不指定数组长度
五、冒泡排序法
冒泡排序法的思想就是相邻的两个元素之间进行比较,按照要求进行交换 比如按照从小到大的顺序排序排列: 进行第一次排序,将第一个元素与第二个元素进行比较,将大的数据交换到第二个 元素里 面,然后第二个元素与第三个元素进行比较,将大的数据交换到第三个元 素里面,以此类推,第一次排序完毕,将最大的数据保存在最后一个元素中 然后进行第二个排序,将第一个元素与第二个元素进行比较,将大的数据交换到第 二个元素里面,然后第二个元素与第三个元素进行比较,将大的数据交换到第三个元素里 面,以此类推,因为最后一个元素已经是最大的了,所以就不需要在进行最后一次比较了, 第二次排序完毕,将第二大的数据保存在倒数第二个元素中
六、二维数组的定义和初始化
二维数组的定义: 数据类型 数组名[行数][列数] eg:int a[2][4]
七、字符数组和字符串
字符数组是元素的数据类型为字符类型的数组,它既具有普通数组的一般性质,又具有 某些特殊性质 字符数组的初始化 逐个字符复制 用字符串常量
八、字符串函数
1 -- strlen( )
2 -- strcpy( )
3 -- strcat( )
4 -- strcmp( ) / strncmp( )
C语言增强之指针
一、概念
在计算机内部存储器(简称内存)中,每一个字节单元,都有一个编号,称为地址 在C语言中,内存单元的地址叫做指针,专门用来存放地址的变量,称为指针变量 在不影响理解的情况下,有时对指针,地址,指针变量不做区分,统称指针 * 定义指针变量时起到标识作用,除此之外标识取一个指针变量的内容 & 取一个变量的地址
二、指针变量的运算
指针运算是以指针变量所存放的地址量作为运算量而进行的运算 因此,指针运算的实质就是地址的计算 所以指针运算的种类是有限的,他只能进行算数运算、关系运算、赋值运算
三、指针与一维数组
指针与一维数组主要研究的就是一维数组的数组名的作用域 int a[4]; a = &a[0] int *p = a; 数组访问每一个元素实质 首地址往后移。指向每一个元素的地址后,获取地址里面的 内容 所以说,只要是一个一维数组,就可以使用一个指针变量对其进行操作,如果能够 开辟一块连续的内存空间,就可以当成一个数组来进行操作和使用 一维数组的所有元素的操作都相当于地址的操作。
四、指针与二维数组
int a[3][4] a :行指针,指向一行内容 &a:地址升级,指向整个数组 *a:地址的降级,将行指针降级为列指针 a[i][j] <==> *(*(a + i) + j)<==> *(a[i] + j)
结构体和共用体
一、结构体的概念
结构体用于存储一组不同类型的数据 结构体是用户自定义的新数据类型,在结构体中可以包含若干个不同数据类型和不同意 义的数据项(当然也可以相同),从而是这些数据项组合起来反应某一个信息
二、定义一个结构体
定义一个结构体类型的一般形式为: struct 结构体名 { 数据类型 成员名1 数据类型 成员名2 .... 数据类型 成员名n };
三、结构体类型变量的定义方法
1 -- 先定义结构体类型再定义变量名
2 -- 在定义类型的同时定义变量
3 -- 直接定义结构类型变量
四、结构体变量的使用形式
结构体变量是不同数据类型的若干数据的集合体。在程序中使用结构体变量时, 一般情况下不能把它作为一个整体参加数据处理,而参加各种运算和操作的是 结构体变量的各个成员项数据。
五、结构体数组的定义
本质是一个数组,数组的每一个成员是一个结构体变量 结构体数组的定义和结构体变量的定义基本一样 struct 结构体名{ 成员列表; }; struct 结构体名 数组名[元素个数]
六、结构体指针
本质是一个指针,指针指向一个结构体,用于保存一个结构体的首地址 一般定义形式: struct 结构体名 *结构体指针名 结构体指针访问成员: p->name (*p).name
七、共用体
在C语言中,不同数据类型的数据可以使用共同的存储区域,这种数据构造类型称为共 用体,简称共用,又称联合体。 共用体在定义、说明、使用的形式上与结构体类型 两者本质上的不同仅在于使用内存的方式上 定义共用体的类型一般为: union 共用体名 { 成员列表; }; 共用体的所有成员共有同一个内存区域
八、typedef
在C语言中,允许使用关键字typedef定义新的数据类型,语法如下: typedef <已有数据类型> <新数据类型>