Linux C总结复盘

经过一周的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语言的知识。同时,也会加强自身敲代码的实践能力,不停留在纸上谈兵的阶段。

以上,就是我这一周来的课程总结。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值