zoukankan      html  css  js  c++  java
  • 2019年7月4日星期四(C语言及LINUX命令)

    一、linux基本命令

    ls/cd/pwd  ->没有修改系统资源,只是浏览linux系统,所以在任何的路径下都可以使用,没有受到权限限制。

    1、 创建普通文件?   -> touch

    用法: touch + [新文件的路径] + ...   -> 既可以是绝对,又可以是相对。

    例子1: 假设当前在家目录,想在家目录下创建一个新的文件,名字叫test.c。

    相对: touch ./test.c  等价于  touch test.c

    绝对: touch /home/gec/test.c

    例子2: 假设当前在/home目录,想在根目录下创建一个新的文件,名字叫example.txt。

    相对: touch ../example.txt

    绝对: touch /example.txt

    提示错误: touch: cannot touch `../example.txt': Permission denied  -> 权限拒绝!

    1)为什么会出现这个错误?

    Permission denied  -> 因为权限不足导致执行失败!

    当前$,代表一个普通用户,在家目录拥有一切的权限,可以在家目录下操作任何的东西都不会受到权限问题。

    如果不在家目录下,则如果修改了系统(增加/删除),都会受到权限的拒绝!

    2)如果真的需要在家目录以外的路径下创建/删除文件?

    方式一:临时切换到超级用户来执行这个命令。  sudo + 命令

    gec@ubuntu:/home$ sudo touch ../example.txt

    [sudo] password for gec:    -> 在linux输入密码,不会回显给用户。

       结果: 当前还是一个普通用户。

    方式二:切换到超级用户,再执行命令。

    gec@ubuntu:/home$ sudo su  -> 切换到超级用户

    root@ubuntu:/home#

    超级管理员名字: root

    当前身份: #

    root@ubuntu:/home# touch ../test.txt  -> 直接执行命令,就不会受到权限干扰。

    root@ubuntu:/home# exit   -> 切换到普通用户

    exit

    gec@ubuntu:/home$

    2、 删除普通文件?  -> rm命令

    用法: rm + [需要删除的文件的路径]

           假设当前在家目录

       练习1: 删除家目录下test.c

              rm ./test.c

       练习2: 删除根目录下example.txt和test.txt

             sudo rm ../../example.txt ../../test.txt   -> 可以跟多个文件的路径。

    二、编辑C语言程序的工具。

    1、 在linux系统下编辑?   ----  使用vi编辑工具。

    首先使用vi指定文件的名字,通过模式切换对文件进行编辑。

    1)在家目录下指定一个新的文件名字叫test.c。

    gec@ubuntu:~$ vi test.c

    2)进入vi工具后,首先是"一般模式"。

       一般模式的特点:不能够对文本进行编辑,只能通过方向键查看文件内容。

    3)按"i"键,切换到"编辑"模式。

       编辑模式特点:在底行会出现一个字符串"-INSERT-",在该模式下,随意编辑文本,但是不能够保存文本!

    4)想保存退出,只能先按"Esc"切换到一般模式,再按":"切换到底行模式。

       w(write) -> 保存

       q(quit)  -> 退出

       底行模式特点: 在底行出现一个":",可以保存退出文本!

    =====================================================================================

    练习:使用vi来编辑程序。

     

    #include <stdio.h>

    int main()

    {

           printf("helloworld! ");

           return 0;

    }

    ======================================================================================

     

    2、 在linux系统下编辑?   ---  使用gedit编辑工具。

    1)使用gedit指定一个文件的名字。

    2)直接编辑,按退出即可!

    3、 在windows系统下编辑?  --> 使用notepad++编辑工具。

    因为在windows编辑完工程之后,需要将文件放置linux下处理,所以需要设置linux与windows的共享目录。

    1)确保共享目录路径在windows下存在。

       D:GZ1934

    2)告诉linux,共享目录在哪里?

       虚拟机  -> 设置  -> 选项  -> 共享文件夹  -> 总是启用  -> 添加  -> 下一步  -> 浏览  -> 主机路径:D:GZ1934

       --> 下一步  -> 完成  -> 确定

    3)使用命令切换到共享目录下路径

       cd /mnt/hgfs/

       ls   -> 看到GZ1934,说明共享成功!

       ls   -> 没有看到任何,重启虚拟机!

       练习1: 成功设置共享目录

       练习2: 在02/code/test.c -> 编辑一下

       练习3: 在linux与windows删除/创建东西,另外一个系统还在不在!

     结论: linux与windows是互通,在linux下操作共享目录下内容,不需要sudo

    思考题:

    1)能不能在/mnt/hgfs下创建任何东西?

    答案:不能,因为这个目录下的内容通过共享设置的,不是通过命令来创建!

    2)能不能在共享目录中创建?

    答案:能,用户随意创建。

    三、分析linux C语言大纲

    1、main函数使用事项、基本数据类型、变量定义/赋值、生命周期作用域、运算符,程序编译过程分析。

    2、ASCII码,语句/表达式,逗号表达式/三目运算,控制流循环与分支结构。

    3、函数定义、调用、声明、函数形式参数与实参之间关系,函数返回值,函数书写规则,函数运行规则。

    4、一些特殊函数调用:递归函数、回调函数、变参函数,内联函数

    5、数组定义/赋值,数组元素,一维数组、二维数组、整型数组、字符数组,指针数组。

    6、指针定义/赋值,指针的数据类型,整型指针,字符指针,数组指针,函数指针,二级指针。

    7、结构体定义,结构体变量、结构体指针、结构体变量与指针如何访问结构体的成员,如何计算结构体的空间。

    8、联合体、枚举类型、typedef、宏定义、头文件、条件编译、拆分多个.c文件

    9、如何申请堆空间?如何释放?

    10、字符串函数,计算字符串长度,拷贝字符串到另一块内存空间,追加字符串,比较两个字符串。

    四、linux C语言基本框架。

    C语言程序入口: main函数  -> main()  -> 每一个程序都必须有main函数。

    1、main函数有什么特点?

    1)程序必须以main作为主函数命名。

    2)程序不是从第一个函数开始执行,而是从main函数开始。

    3)main函数在程序中有且仅有一个。

    2、main函数基本框架?

    main()   -> 函数头

    {      -> 函数体

     

    }

    3、linux函数属于一个任务,每一个任务都会一个返回值,返回值就会返回给调用函数的地方。

    返回值类型写在函数头前面。

    返回值类型 main()

    {

           ...;

           ...;

           return 返回值结果;  

    }

    注意事项:

    1)返回值类型可以是基本数据类型,也可以是自定义数据类型。

    2)main执行return代表程序的退出,子函数执行了return代表子函数返回,返回到调用的地方。

    3)返回值结果必须与返回值类型匹配。

    例子:

    int fun()

    {

           ...;

           return 1; -> 返回到main函数中

    }

     

    int main()

    {

           fun();

           return 0;  -> 代表程序结果

    }

    4、头文件

    1)程序中一定要添加头文件吗?

    不是。如果程序没有调用到任何的函数,则不需要添加头文件,只有当程序调用了函数,才需要添加对应的头文件。

    例子:以下例子不需要添加头文件

    int main()  

    {

           return 0;

    }

    2)头文件有什么作用?

    对函数进行声明,函数在调用前必须声明,否则就会编译警告!

    3)函数对应的头文件是什么?

    例子: printf()  -> 在Ubuntu终端输入: man 3 printf(按'q'退出)  -> 得到对应的头文件: #include <stdio.h>

    例子:

    #include <stdio.h>

     

    int main()

    {

           printf("helloworld! ");

           return 0;

    }

    4)头文件不加会有什么问题?

    warning: incompatible implicit declaration of built-in function ‘xxxxx’  -> xxxxx这个函数的头文件没有添加!

    5、 linux在运行程序时,需要给程序传递一些命令行参数

    1)怎么样才能实现命令行传参?

    int main() / int main(void)  -> main函数不需要命令传递参数

    int main(int argc,char *argv[])  -> main函数可以进行命令行传参

     argc -> argument count  参数个数

     argv -> argument value  参数的值

     ./a.out              -> argc = 1  argv[0] = "./a.out"

     ./a.out aaa            -> argc = 2  argv[0]  ="./a.out"  argv[1] = "aaa"

     ./a.out aaa bbb        -> argc = 3  argv[0] = "./a.out"  argv[1] = "aaa"  argv[2] = "bbb"

     ./a.out aaabbb         -> argc = 2  argv[0] = "./a.out"  argv[1] = "aaabbb"

    2)printf()如何输出命令行参数内容?

      %d  -> 以十进制形式输出内容

      %s  -> 输出字符串

    3)命令行传递参数有什么作用?

    使用命令行传递参数,argv数组中值就可以每一个执行结果都不一样,并不需要每一个修改都要重新编译。

        练习4:无论输入多少个参数,程序都可以将所有的参数都打印出来!

           ./a.out

           ./a.out aaa

           ./a.out aaa bbb

     

    #include <stdio.h>

                                 //  argv[0]   argv[1]  argv[2] argv[3]

    int main(int argc,char *argv[])  //  ./a.out    aaa      bbb     ccc

    {

           int i;

           for(i=0;i<argc;i++)

           {

                  printf("argv[%d] = %s ",i,argv[i]);

           }

           return 0;

    }

    6、注释  -> 对代码进行解析,需要添加对应的注释。

     

      单行注释:  //注释内容

      多行注释:  /*注释内容*/

    7、缩进与空行

    当有复合语句{}时,需要将复合语句中所有表达式进行缩进。

    代码中每一个模块使用空行进行分隔,复合语句{}需要独立出来一行。

    8、编译程序

    编译器: gcc

    用法: gcc + [需要编译文件的路径]

    1)为什么需要进行编译?

    因为C语言属于高级语法,机器只能看懂二进制程序,所以需要将C语言编译为二进制文件,才能在机器上运行。

    2)如何编译?

    如果不指定新的二进制文件名字是什么,那么编译器默认在当前目录下生成一个a.out二进制文件。

    编译命令: gcc test.c  -> 默认在当前目录下生成a.out二进制文件。

             gcc test.c -o test  -> 默认在当前目录下生成test二进制文件。

    3)执行二进制程序

    执行命令: ./a.out

    执行命令: ./test

      a.out与test除了名字不一样,其他都一样!

    五、基本数据类型与变量

    1、 linux C语言中基本数据类型有哪些?

    char、short、int、long、float、double。

    2、 这些数据类型在内存中占用多少个字节?

    使用sizeof()进行计算。

    char、short、int、long、float、double。

     1      2     4    4     4       8   -> 基本数据类型占用空间大小由C语言编译系统决定!

    3、 如何定义变量?

    公式: 数据类型 + 变量名

    数据类型?  -> 从基本数据类型中选择一个。

    变量名定义规则?

    1)只能由数字、字母,下划线组成。

    2)不能以数字开头。

    3)不可以与系统的关键字重名。

    例子: 定义一个整型变量?

           int a;   -> 在内存空间连续申请4个字节,使用变量a间接访问这片内存空间。

    4、 程序运行时,会占用内存空间?

    =========test.c=========

    int main()

    {

           int a;

           return 0;

    }

    ========================

    ./test  -> 将你的程序加载内存中

    int a;  -> 在内存空间连续申请4个字节,使用变量a间接访问这片内存空间。

    return 0;  -> 释放空间

    5、内存如何分配空间?   -> 原则: 连续空闲不确定

    1)分配空间时,内存一定是连续的。

    2)分配的空间,一定是空闲的(之前没有变量申请过的)

    3)分配空间时,位置是不确定的。

    六、运算符号

    + - * / % == != | || & &&

      + - *

      /   -> 结果看两边符号

      5/3 = 1

      5.0/3 = 1.666667

      5/3.0 = 1.666667

      5.0/3.0 = 1.666667

      %  -> 取余,两边不能出现小数点

      5.0%3

      5%3.0

      5.0%3.0

      5%3  -> 正确

      ==  判断等于

      !=  判断不等于

      |   -> 位或运算

      ||  -> 逻辑或运算

      &   -> 位与运算

      &&  -> 逻辑与运算

      5&6 = 0101 & 0110 = 4

      5&&6 = 1  (非0即真)

      5|6 = 0101 | 0110 = 7

      5||0 = 1  (非0即真)

  • 相关阅读:
    线性表——(2)单向链表
    线性表——(1)顺序表
    UVa 1592 数据库
    UVa 12096 集合栈计算机
    Python 协程
    Python 多线程及进程
    Python 日志(Log)
    Python 函数式编程
    Python基础
    DB2 获取前两天的数据
  • 原文地址:https://www.cnblogs.com/zjlbk/p/11153498.html
Copyright © 2011-2022 走看看