为时一周半左右的Linux c基础学习,主要学习了shell编程,结构体,makefile文件的编写等,下面就进行简单概括:
一、shell编程
shell编程就是一堆shell命令的集合
1.shell命令的执行过程:创建一个.sh文件;修改文件的权限;执行
2.shell的注释:必须写在程序的首行,告诉计算机使用的版本
3.变量:
用户自定义变量:
1.命名规范: 由数字,字母,下划线组成,首字母不能为数字 ;不能为关键字和保留字 ;尽量见名知意,尽量大写
2.访问shell变量,变量赋值时,等号左右两边不能有空格
3.预定义变量:
$# 包含命令行参数的个数 $@ 包含所有命令行参数:"$1 $2 ...$9" $* 包含所有命令行参数:"$1,$2.....$9" $$: 包含正在执行进程的ID号 $? 包含前一个命令退出的状态
4.环境变量:HOME,PATH等
5.shell程序和语句:
说明性语句,功能性语句,算术运算命令expr
test测试命令:
测试字符串 :s1 = s2 测试 两个字符串的内容是否完全一样 ;
s1!= s2测试两个字符串的内容是否有差异 ;
-z s1测试s1字符串的长度是否为0 ;
-n s1测试s1字符串的长度是否不为0
测试整数 :a -eq b 测试a与b相等 (equal);
a -ne b 测试a与b不相等;
a -gt b 测试a是否大于b (great);
a -ge b 测试a是否大于等于b a -lt b;
测试a是否小于b a -le b;
测试a是否小于等于b
文件属性:
-d name 测试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更旧
结构性语句:
1.顺序:read输入和echo输出
2.选择:单分支多分支和双分支
case 字符串变量 in
# 1|3|5|7
模式1|模式11|模式12)
语句1
;; #---->break
模式2)
语句2
;;
模式3)
语句3
;;
....
3.循环
1.for
<1>.带列表的for
模式n)
语句n
;;
*)
语句n+1
;;
esac
3.循环:for循环(分为带列表,没带列表和带c的for)
while循环(break和continue跳出循环)
4.函数的调用
方式一:
value_name=`function_name arg1 arg2`
变量名=`函数名 参数1 参数2`
函数的所有标准输出都传递给了主程序的变量
方式二:
function_name arg1 arg2
函数名 参数1 参数2
echo $? #$?上一个命令退出的状态
二、结构体
1.定义结构体举例创建
//定义结构体语句
struct 结构体名字
{
属性1;
属性2;
属性3;
};
//(学生)集合属性:
1.姓名 char name[SIZE]; //字符数组和字符串是标配
2.身高 int height; //基本数据
3.三门成绩 float scores[3];//数组
//定义一个学生的结构体
struct student
{
char name[20];
int height;
float scores[3];
};
2.内存管理
3.在堆区分配空间和释放空间
分配空间:
#include <stdlib.h>
//参数:你要分配空间的大小
//返回值:void * void (表示空) void * (任何数据类型的地址)
//分配成功返回空间的首地址,失败则返回NULL
//malloc分配的空间未进行清空
void *malloc(size_t size);
三、makefile文件
1.自定义头文件
要求后缀必须为.h;
“”和<>的区别:“” 编译器从用户的工作路径开始搜索头文件
<>: 编译器从标准库路径开始搜索头文件
2.条件编译:
作用:避免头文件被重复引入,实例如下:
//stu.c
#ifndef _STU_H
#define _STU_H
//<1>.引入库头文件
//<2>.宏定义
//<3>.结构体类型的定义
//<4>.枚举类型的定义
//<5>.函数声明
//<1>.引入库头文件
#include <stdlib.h>
5.建议阅读LinuxC--->(53-54)
3.gcc工作原理
vim--->命令模式---->gt 切换多个文件切换
1.分阶段执行
1.预处理
2.编译
3.汇编
4.链接:
在连接阶段将输入的机器代码文件*.o(与其它的机器代码文件和库文件)汇集成一个可执行的二进制代
码文件
//<2>.宏定义
#define N 20
#define M 3
#define SIZE 5
//<3>.结构体类型的定义
//该句话是前两句话的简化
typedef struct student
{
char name[N];
int height;
float scores[M];
}Stu;
//<4>.枚举类型的定义
//<5>.函数声明
void output(Stu * ps,int n);
void menu(void);
void input(Stu * ps,int n);
Stu *calpmaxheight(Stu *ps,int n);
void sortHeight(Stu * ps,int n);
#endif
3.gcc工作原理:
vim--->命令模式---->gt 切换多个文件切换
分阶段执行:预处理,编译,汇编,链接
链接的作用:在连接阶段将输入的机器代码文件*.o(与其它的机器代码文件和库文件)汇集成一个可执行的二进制代 码文件
4.makefile变量:
自动变量 :.$@ 目标文件 .$^ 所有的依赖文件 .$< 第一个依赖文件
预定义变量 :Makefile预定义变量包含了常见编译器,汇编器的名称及其编译选项 .
CC C编译器的名称,默认为cc . CFLAGS C编译的选项,无默认值 .
RM 文件删除程序的名称,默认值为rm -f
5.makefile的变量展开方式:
递归展示方式:
简单展开方式:
四、函数指针
定义函数指针:
//定义一个指向int的指针
int * pi; (int)
//定义一个指向int的指針的指針
int ** ppi; (int *)
//定义一个指向char的指针
char * pc; (char)
//定义一个指向数组的指针,该数组是一个长度为5的int的数组
int (*parr) [5]; (int [5]) int arr[5]
int (*parr) [5]
//定义一个指向结构体的指针,该结构体的类型(Stu)
Stu * ps; (Stu)
//定义一个指向函数的指针,该函数参数为两个int,返回值為一个int的函数
函数的类型: 返回值类型 (参数列表)
int (int,int) int add(int,int)
int (*pfun) (int,int)
存储类型:
register 寄存器;auto (默认) 存储类型 类型名 变量名;extern 外部的
1.变量 局部变量 :定义在函数体内部的变量,称为叫局部变量
作用域:自定义开始到最近}结束,函数作用域 ,块作用域
生命周期:函数调用分配,函数结束释放
全局变量:定义在函数体外部的变量,称为叫全局变量
作用域:自定义开始到文件 文件作用域
2.extern修饰全局变量
//show2.c
#include <stdio.h>
extern int a; //使用外部变量a
void show2(void)
{
a+=20;
printf("show2 a=%d\n",a);
}
3.extern修饰函数
include <stdio.h>
//extern修饰函数:使用外部的函数
extern void show1(void);
extern void show2(void);
int main(void)
{
show1();
show2();
}
4.static 静态的
static修饰全局变量 (隐藏);
static修饰函数 (隐藏);
static局部变量:延长变量的生命周期
5.枚举:(语义化)定义常量的一种方式