Linux_C高级day2

LinuxC高级_day2
【1】 学生管理系统

  1. 拆分文件
    主函数文件 - 整体框架 - 调其他功能函数
    接口文件 - 很多功能函数
    头文件 - 结构体声明 函数声明 共同体 枚举 宏定义
  2. H文件 student.h
    #ifndef STUDENT_H //防止头文件重复包含
    #define STUDENT_H

#endif

  1. 主函数文件
    #include <stdio.h> // 头文件放在/user/bin
    #include “student.h” //先到自己的目录去找,找不到去/user/bin,自己定义的头文件用""
    #include “…/stu/student.h” //可以加路径
    测试:
    class_t *cls = NULL;
    cls = (class_t *)malloc(sizeof(class_t)); //cls *cls class_t

【2】 指针(指针的类型 指针指向的类型)
变量类型 * 变量名 //*没有取地址的功能,他只是表示这是一个指针变量,32位操作系统指针都是四个字节
char *p - sizeof§=4 sizeof(*p)=1

从定义区分
int p 整型变量
int p p先和结合说明是个指针再和int结合说明是指向的是int类型 p是一个指向整型数据的指针
int p[3] p先和[]结合说明是个数组再和int结合说明数组里的元素是int类型 p是一个整型数据组成的数组
int p[3] p先和[]结合([]优先级比高)说明是个数组,再和结合说明里面的元素类型是指针,再和int结合说明指针指向了int类型,p是个存放了指向int类型指针的数组
int (p)[3] 先和结合(小括号优先级高)说明是个指针,再和[]结合说明指针指向了一个数组,再和int结合,说明这个数组里的元素int类型,p是个指向存放int类型数组的指针
int **p 先和第一个
结合说明是这个指针,再和第二个*结合,说明指向的内容还是个指针,p是二级指针
int func(int)//函数 int func(int a) 参数和返回值都是int类型
int (p)(int) 先和结合说明是个指针,指针指向了一个函数,p是一个函数指针 p = func;

指针指向的类型 声明语句里去掉指针的名字和最靠近他的*
int *p – int
char *p – char
int **p – int *
int(*p)[3] – int()[3]

指针的类型 声明语句里去掉指针的名字
int *p – int *
char *p – char *
int **p – int **
int(p)[3] – int()[3]

[练习]

  1. int a[5]={1,2,3,4,5};
    int *p = a;

    a[i] *(a+i) *(&a[0]+i) //*a++ 数组名是个常量
    p[i] *(p+i) *(&p[0]+i) *p++

    *p++ // 取出a[0]再p++
    *(p++) // 取出a[0]再p++ ++是后操作
    (*p)++ // a[0]=a[0]+1
    *(++p) // 取出a[1]
    *++p // 取出a[1]

  2. char a[10] = “hello”;
    char *p = a;

    printf("%s\n",a/p);
    for(i=0;i<10;i++)
    putchar(a[i]/p[i]);

    char a[10] = {‘h’,‘e’,‘l’,‘l’,‘o’};
    char *p = “www.hqyj.com” //把字符串的首地址放在p
    //“www.hqyj.com” .ro只读
    a[0] =‘w’; //正确的
    *p =‘t’; //错误的
    *a++; //错误的
    *p++; //正确的 *p; p++;
    (*p)++; //错误的 (*p)=w p[0]=w+1
    *(++p);//正确的
    a = p; //错误的 给常量赋值X
    p = a; //正确的
    a = “world”; //错误的
    p = “hello”; //正确的

  3. int *p ,i ,j;
    int a[3][2]={1,2,3,4,5,6};

    p=a[0];
    p=&a[0][0];
    // p=a; p+1 - 4 a+1 - 8含义不同不能直接赋值
    for(i=0;i<6;i++)
    printf("%d\n",*p++);

    p=&a[0][0];
    for(i=0;i<3;i++)
    for(j=0;j<2;j++)
    printf("%d\n",(p+2i+j));

  4. 指针数组 char *a[3]
    int x=100,y=200;
    int *a[2];
    a[0]=&x a[1]=&y;
    char *a[3]={“hello”,“world”,“haha”};

  5. 数组指针 char(*p)[3] //行指针
    a[i][j] *(a[i]+j) ((a+i)+j)
    p[i][j] *(p[i]+j) ((p+i)+j)

【3】 网络基础

  1. IP地址:主机在网络中的编号
  2. 192.168.31(网络号) .88(主机号) 点分十进制来表示的(IPv4 - 32byte)
    IPv6 - 128byte
  3. 网络划分
    A类 政府机构 0.0.0.0-127.255.255.255
    B类 中等规模的公司 128.0.0.0 - 191.255.255.255
    C类 分配给需要的人 192.0.0.0 - 223.255.255.255
    D类 用于组播 224.0.0.0 - 239.255.255.255
    E类 实验(未使用) 240.0.0.0 - 255.255.255.255
    192.168.31.1 - 通常会被作为路由或者网关
    192.168.31.255 - 广播地址

4.子网掩码 netmask 255.255.255.0
255.255.255.0 & 192.168.31.88 = 网络号

  1. DNS 域名解析
    www.baidu.com ->ip
    *免费的域名解析器
    114.114.114.114
    8.8.8.8

  2. Ubuntu网络设置
    1)ifconfig
    inet addr:192.168.31.166 //Ubuntu IP地址
    Bcast:192.168.31.255 //广播地址
    Mask:255.255.255.0 //子网掩码
    MTU:1500 //一个网络包最多有1500个字节
    Link encap:Local Loopback //回环地址
    inet addr:127.0.0.1 //发数据给网卡,网卡返回给我的数据
    检查网卡是否正常 ping 127.0.0.1

  1. A.通过命令行
    sudo ifconfig eth0 192.168.31.88(ip地址)
    route add default gw 192.168.31.1(网关地址)
    B. 网络配置文件 - 固定电脑IP,设置为静态
    sudo vim /etc/network/interfaces
    iface eth0 inet static //interface接口
    address 192.168.31.87
    netmask 255.255.255.0
    gateway 192.168.31.1
    broadcast 192.168.31.255
    dns-nameservers 8.8.8.8
    3)重启网络
    sudo service network-manager restart
    sudo /etc/init.d/networking restart

[练习]
1.安装文件传输服务器tftp
2.nfs网络文件系统(netwrok file system)
/home/linux/nfs *(rw,sync,no_subtree_check,no_root_squash)
*:所有用户
rw:读写
sync:实现文件的同步
no_subtree_check:不检查子目录的权限

【4】 文件的压缩和打包

  1. windows的压缩软件:winrar 7zip实际上汇总了打包和压缩两个过程
    [1]压缩
  2. 压缩的对象是文件不是目录
    .gz
    .bz2
    .xz
    压缩/解压的命令
    gzip/gunzip 文件名
    bzip2/bunzip2 文件名
    xz/unxz 文件名
  3. 压缩的原理 算法 换行啊空格之类的删除,只有一行的话怎么压缩也不会变得很小
  4. 压缩率(占用的大小):gzip < bzip2 < xz
    压缩速率(速度时间):gzip > bzip2 > xz
  5. ls -lh 可以显示文件的大小
    gzip COPING
    gunzip COPING.gz
    1.压缩之后源文件不保留,解压压缩包不保留
    2.压缩的对象是文件而不是目录
    gzip: hello is a directory – ignored
    3.xz在100M以上的文件才能体现压缩率

[2]打包

  1. 打包的对象是目录

  2. tar打包和拆包
    -c 打包(create)
    -x 拆包
    -f 文件名 —>一定是最后的位置
    -v 显示过程
    eg:
    tar -cvf 目录名.tar(包名) 目录名(对象)
    tar -cvf hello.tar hello //把hello目录打包为hello.tar

    1. 打包之后目录编程文件,所以可以对这个文件压缩
    2. 对文件归档,变大了
    3. 打包之后原来的目录存在

    tar -xvf 包名
    tar -xvf hello.tar //把hello.tar拆包

    1. 拆包之后原来的包存在

[问题] 文件 - 打包 - 压缩 - 解压 - 拆包 - 文件
-z gzip压缩
-j bzip2压缩
-J xz压缩

eg: 打包并压缩成gz的格式
hello -> hello.tar -> hello.tar.gz
tar -czvf hello.tar.gz hello

打包并压缩成gz - 拆包并解压
tar -czvf XX.tar.gz 目录名
tar -xzvf XX.tar.gz

打包并压缩成bz2 - 拆包并解压
tar -cjvf XX.tar.bz2 目录名
tar -xjvf XX.tar.bz2

打包并压缩成xz - 拆包并解压
tar -cJvf XX.tar.xz 目录名
tar -xJvf XX.tar.xz

[练习] 解压拆包hello.tar.xz(有问题)
tar -xJvf hello.tar.xz --不成功
tar -cjvf hello.tar.xz hello --不提示错误,不压缩
万能拆包 : tar -xvf 包名

【5】 文件相关的命令

  1. 创建 touch
  2. 删除 rm
  3. 重名名/移动 mv
  4. 复制cp
  5. cat 将文件的内容显示到中端上
    cat hello.c
    cat -n 文件名 //显示行号
  6. echo
    echo “123”
    echo “hello” > 1.c
  7. head 文件名 //默认从头开始显示前十行
    head -n行 文件名 //显示前n行
  8. tail 文件名 //默认显示后十行
    tail -n行 文件名 //显示后n行
    [练习] 1. 显示passwd文件的第34行
    head -34 passwd | tail -1
    2. 同时看到行号
    cat -n passwd |head -34 | tail -1
  9. file查看文件格式
    file ls
    file a.out
  10. wc查看文件大小
    wc 文件名 //全部显示
    wc -w 文件名 //单词个数
    wc -l 文件名 //行数
    wc -c 文件名 //字符数
  11. grep搜索 在文件中搜索字符串
    grep “string” 文件名/目录 参数
    参数:
    -n 显示行号
    -R 递归搜索
    -i 忽略大小写
    -w 按照单词精确搜索
    eg:
    grep “linux” passwd
    grep “main” ./ -Ri //忽略大小写
    grep “main” ./ -wRn //精确搜索出main
  12. more 文件名 (回车继续往下显示)
    less 文件名 上键向上显示 下键向下显示 q退出
  13. 查看二进制文件
    od -c 二进制文件名(a.out)
    od -c a.out //如果全是0肯定不对

[练习] passwd文件 - 搜索linux用户是否存在,如果存在就显示linux的用户信息,linux123 abclinux不显示
grep “^linux” passwd -w
^abc 以abc开头
abc$ 以abc结尾
^abc$ 这一行只有abc

  • /etc/passwd
    linux❌1000:1000:linux,:/home/linux:/bin/bash
    用户名 有密码 用户ID 组ID 登录时候的名字 家目录 命令解析器
    只能切换linux和root用户,其他是伪用户,不能切换
  1. 文件的查找find
    find 路径 -name 文件名
    find ./ -name student.c //从当前位置向里搜索student.c文件在哪

[*拓展]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值