2019年7月4日星期四

1、linux基本命令linux

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

一、 建立普通文件?   -> touchwindows

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

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

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

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

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

相对: touch ../example.txtspa

绝对: 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$

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

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

       假设当前在家目录

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

          rm ./test.c

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

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

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

一、 在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!\n");

       return 0;

}

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

 

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

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

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

三、 在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)能不能在共享目录中建立?

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

3、分析linux C语言大纲

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

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

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

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

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

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

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

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

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

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

4、linux C语言基本框架。

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

一、main函数有什么特色?

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

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

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

二、main函数基本框架?

main()   -> 函数头

{      -> 函数体

 

}

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

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

返回值类型 main()

{

       ...;

       ...;

       return 返回值结果;  

}

注意事项:

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

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

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

例子:

int fun()

{

       ...;

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

}

 

int main()

{

       fun();

       return 0;  -> 表明程序结果

}

四、头文件

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

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

例子:如下例子不须要添加头文件

int main()  

{

       return 0;

}

2)头文件有什么做用?

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

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

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

例子:

#include <stdio.h>

 

int main()

{

       printf("helloworld!\n");

       return 0;

}

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

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

五、 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\n",i,argv[i]);

       }

       return 0;

}

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

 

  单行注释:  //注释内容

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

七、缩进与空行

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

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

八、编译程序

编译器: 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除了名字不同,其余都同样!

5、基本数据类型与变量

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

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

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

使用sizeof()进行计算。

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

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

三、 如何定义变量?

公式: 数据类型 + 变量名

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

变量名定义规则?

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

2)不能以数字开头。

3)不能够与系统的关键字重名。

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

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

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

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

int main()

{

       int a;

       return 0;

}

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

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

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

return 0;  -> 释放空间

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

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

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

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

6、运算符号

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

  + - *

  /   -> 结果看两边符号

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

相关文章
相关标签/搜索