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即真)

原文地址:https://www.cnblogs.com/zjlbk/p/11153498.html