经过一周的Linux C语言课程学习,我对Linux C语言的知识内容的了解也在不断加深。这一周的课程主要讲解了shell编程、结构体、make工程管理器、函数指针等方面。下面就对这几个方面的知识进行概况总结:
一、shell编程
1、什么是shell
shell:命令行解释器,用户和内核之间的桥梁
shell也是一个程序,提供给了我们一个界面(终端)
shell版本:
Bourne Shell: 最早的Shell
C Shell
Ksh
Z Shell
Bourne-again shell(bash)
2、shell命令的格式
命令名称 [选项] [参数]
shell命令的三要素:
(1)一条命令三要素之间必须要有空格隔开 .
(2)若多个命令在一行书写,用分号(;)将各命令隔开
(3)如果一条命令不能在一行写完,在行尾使用反斜杠\ 标明该条命令未结束
3、shell编程
1、shell执行过程
(1)创建一个.sh文件
(2)修改文件的权限
(3)执行
2、变量
用户自定义变量命名规范:
(1)由数字,字母,下划线组成,首字母不能为数字
(2)不能为关键字和保留字
(3)尽量见名知意,尽量大写
预定义变量:
$# 包含命令行参数的个数
$@ 包含所有命令行参数:"$1 $2 ...$9"
$* 包含所有命令行参数:"$1,$2.....$9"
$$: 包含正在执行进程的ID号
$? 包含前一个命令退出的状态
3、shell程序和语句
read 输入
echo输出
算术运算命令 expr
test命令:
(1)测试字符串
s1 = s2 测试两个字符串的内容是否完全一样
s1!= s2 测试两个字符串的内容是否有差异
-z s1 测试s1字符串的长度是否为0
-n s1 测试s1字符串的长度是否不为0
(2)测试整数
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
(3)文件属性
-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更旧
选择语句:
if [条件为真]
then
语句
fi
循环语句
while [条件为真]
do
语句
done
二、结构体
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、如何创建结构体变量
#include <stdio.h>
//定义一个学生的结构体数据类型
struct student
{
char name[20];
int height;
float scores[3];
};
//定义一个结构体数据类型,该名字叫struct student
int main(void)
{
//类型名 变量名;
//定义一个结构体变量并进行初始化
struct student s1={"lisi",183,{90,89,78}};
return 0;
}
3、如何访问变量的值
#include <stdio.h>
//定义一个学生的结构体数据类型
#define N 20
#define M 3
struct student
{
char name[N];
int height;
float scores[M];
};
//定义一个结构体数据类型,该名字叫struct student
int main(void)
{
//类型名 变量名;
//定义一个结构体变量并进行初始化
struct student s1={"lisi",183,{90,89,78}};
int i=0;
//输入
printf("请输入姓名,身高,三门成绩\n");
scanf("%s%d",s1.name,&s1.height);
for(i=0;i<M;i++)
{
scanf("%f",&s1.scores[i]);
}
//输出:
printf("%s %d ",s1.name,s1.height);
for(i=0;i<M;i++)
{
printf("%5.0f",s1.scores[i]);
}
printf("\n");
return 0;
}
4、如何操作结构体的指针
#include <stdio.h>
//定义一个学生的结构体数据类型
#define N 20
#define M 3
struct student
{
char name[N];
int height;
float scores[M];
};
//定义一个结构体数据类型,该名字叫struct student
int main(void)
{
//类型名 变量名;
//定义一个结构体变量并进行初始化
struct student s1={"lisi",183,{90,89,78}};
//定义一个指向int的指针
//int * pi=NULL; pi=&i; i<===>*pi
//定义一个指向结构体的指针
struct student * ps=NULL;
ps=&s1; //ps指向s1 s1<===>*ps
//结构体指针访问 指针名->成员名
int i=0;
printf("请输入姓名,身高,三门成绩\n");
scanf("%s",ps->name);
scanf("%d",&ps->height);
for(i=0;i<M;i++)
{
scanf("%f",&ps->scores[i]);
}
printf("%10s",ps->name);
printf("%5d",ps->height);
for(i=0;i<M;i++)
{
printf("%5.0f",ps->scores[i]);
}
printf("\n");
//通过ps访问
/*printf("s1 name=%s height=%d ",(*ps).name,(*ps).height);
for(i=0;i<M;i++)
{
printf("%5.0f",(*ps).scores[i]);
}
printf("\n");*/
return 0;
}
5、结构体和堆区空间关联起来
typedef struct student
{
char name[N];
int height;
float scores[M];
}Stu;
int main(void)
{
Stu * ps=NULL;
//1.分配空间
//再堆区创建5个存结构体的空间
ps=(Stu *)malloc(sizeof(Stu)*SIZE);
//2.出错判断
if(NULL==ps)
{
perror("malloc error");
return -1;
}
//3.释放
free(ps);
ps=NULL;
return 0;
}
三、make工程管理器
1、make的工作原理
默认在当前路径下查找一个makefile/Makefile的文件
2、Makefile
3、Makefile中假目标
4、Makefile变量
自定义变量
自动变量:
$@ 目标文件
$^ 所有的依赖文件
$< 第一个依赖文件
预定义变量:
CC C编译器的名称,默认为cc
CFLAGS C编译的选项,无默认值
RM 文件删除程序的名称,默认值为rm -f
5、Makefile中变量的展开方式
递归展开方式和简单展开方式
四、函数指针
1、如何定义函数指针
//定义一个指向函数的指针,该函数参数为两个int,返回值為一个int的函数
函数的类型: 返回值类型 (参数列表)
int (int,int) int add(int,int)
int (*pfun) (int,int)
2、定义一个长度为4的数组,该数组中的每个元素是个函数的指针
//定义一个长度为4的数组,该数组中的每个元素是个函数的指针
int ( *pfunArr[4] ) (int,int )={add,sub,mul,div};
//pfunArr[0]-->add pfunArr[1]->sub pfunArr[2]-->mul pfunArr[3]--div
3、函数参数可以是函数指针
//定义一个函数
//参数1:一个函数指针 函数类型(int (int ,int )) 参数2 int ,参数3 int
//返回值:int
int pfunaction(int (*pfun)(int,int),int num1,int num2);
int pfunaction(int (*pfun)(int,int),int num1,int num2)
{
return pfun(num1,num2);
}
4、函数指针也可以取别名 (typedef )
//给函数指针取了别名
typedef int (*PFUN) (int,int ); //给函数指针取了别名 int (*) (int,int) ---->PFUN
类型名
int (*pfun) (int,int);
PFUN pfun; 类型名 指针变量名;
int ( *pfunArr[4] ) (int,int )={add,sub,mul,div};
PFUN pfunArr[4]={add,sub,mul,div};
int pfunaction(int (*pfun)(int,int),int num1,int num2)
{
return pfun(num1,num2);
}
int pfunaction(PFUN pfun,int num1,int num2)
{
return pfun(num1,num2);
}
对于以上的内容,有些内容掌握的差不多,有些内容一知半解,在这次的Linux C测试中,我深感自身能力的不足,在后面的课程中,我会逐步查缺补漏,不断加深巩固Linux C语言的知识。同时,也会加强自身敲代码的实践能力,不停留在纸上谈兵的阶段。
以上,就是我这一周来的课程总结。