Linux系统基础命令和C语言
1.环境安装
在Windows中两种方法,一、直接安装一个Linux系统,电脑原有文件缺失,二、安装虚拟机。
本次课程用的是Linux下的Ubuntu版本。
2.Linux常用命令
文件系统层次结构标准FHS
/ bin :bin是二进制(binary)英文缩写。
/ boot:存放的都是系统启动时要用到的程序。
/ dev:包含了所有Linux系统中使用的外部设备。
/ etc:存放了系统管理时要用到的各种配置文件和子目录。
/ lib :存放系统动态连接共享库的。
/ home:普通用户的主目录
/ root:根用户(超级用户)的主目录
pwd命令
用于显示用户在文件系统中的当前位置。该命令没有任何选项和参数,命令执行结果显示为绝对路径名。打印当前目录。
ls命令
浏览目录,显示当前目录下的内容。
man命令 查看命令的帮助内容。
ctrl l命令 清屏
cd命令 切换
思考 Linux文件系统与Windows 文件系统有什么区别?
插入一个u盘,在盘里建一个文件。在Linux中,盘已经自动的跑到了我的家目录的这个文件夹当中。并不是大家所想象的多了一个盘符,这个样子。Windows系统是多了一个盘。
熟练使用查看文件内容的命令
熟练使用文件复制命令
复制一个文件夹的时候,要加r。
熟练使用文件移动命令
熟练使用创建和删除文件命令
touch 文件 mkdir 文件夹
创建文件夹
加-p是文件夹联级创建,删除加r
3.vi编辑器
熟悉v的三种模式及模式切换命令
命令行模式 有四个命令可以进入插入模式
a (Append)进入编辑状态,从当前光标之后的位置开始插入键盘输入的字符 (后面追加的意思)
i (Insert)进入编辑状态,从当前 光标之后的位置开始插入键盘输入的字符
I 光标直接定位在行首
o (Open)进入编辑状态,并插入一新行,光标移动到该新行的行首,以后键盘输入的字符将插入到光标位置。
Esc 进入命令状态。
大写的i是行首插入 大写的a是行尾插入 大写的 O是在光标的上面一行插空行。
插入模式
此模式下,底下有insert提示,可以编辑,复制,
底行模式
:q
(Quit)退出没有修改的文件(若文件被修改了而没有保存,则此命令无效)
:q!
强制退出,且不保存修改过的部分
:w
(Write)保存文件,但不退出
:wq 保存并且退出
:x (Exit)保存文件并退出
:w File 另存为File给出的文件名,不退出
:r File (Read)读入File指定的文件内容插入到光标位置 引入文件
:!Command 在vi中执行外部命令Command,按回车键以返回 vi继续工作。比如(1):!pwd,查看当前vi执行的文件夹,(2):!date 查看日期
熟练使用vi的拷贝和粘贴命令
[N]x (Expurgate)删除从光标位置开始的连续N个字符(并复制到编辑缓冲区)
[N]dd (Delete)删除从光标位置开始的连续N行(并复制到编辑缓冲区)
[N]yy (Yank)复制从光标位置开始的连续N行到编辑缓冲区 加数字可以选几行
p或P (Put)从编辑缓冲区复制文本到当前光标位置 (即粘贴) 小写在后面粘贴,大写在前面粘贴
u (Undo)取消上一次操作
熟练使用vi的保存和退出命令
:!wq :x
熟练使用v的光标命令
h 方向键,向左移动光标一个字符
j 方向键,向下移动光标到下一行
k 方向键,向上移动光标到上一行
i方向键,向右移动光标一个字符
:N 移动光标到第N行(N待定
1G 移动光标到文件的第1行
G 移动光标到文件的最后1行
:set number 设置显示行号
:set nonumber 取消显示行号
熟练使用vi的查找命令
熟练使用vi的替换命令
熟练使用vi的复制和剪切命令
4.基础知识
机器语言 直接使用机器指令(0,1序列)来设计程序, 计算机系统直接识别。和自然语言完全不同难 于记忆和理解,工作量大,效率低,无法移值。
汇编语言 把机器指令符号化,即通过一组简单的符号来 表示机器指令,更接近于自然语言,更容易理解和使用。和机器语言一样,开发工作量大。
它就具备了我们可以去熟练使用的这样一种能力。降低了门槛。但是汇编语言中,你要非常的熟悉一些硬件;你要熟悉这个特定的这一款处理器。处理器变了,那么你的汇编代码的实际的控制,计算机情况不一样,汇编语言也要变,比如32位,64位处理器都不同。和硬件依赖特别大。
5.数据表示
送入计算机的数字,字母,符号等信息必须转换成0 1组合的数据形式才能被计算机识别。
16进制转10进制
6.程序编译和调试
gcc -o hello hello.c
-O输出可执行文件
-c只要求编译器输出目标代码(.O文件)而不必输 出可执行文件
-g用于调试
./hello查看输出结果
ctrl+shift+n是再开一个窗口;
ctrlshift+t是开一个tab标签;
用vi写一个1+2+3+....+10的程序
用gcc编译这个程序
注意是两个下划线。
C语言基础 一个程序应当包含两部分内容:
对数据的描述。在程序中要指定数据的类型和数据的组织形 式,即数据结构
对操作的描述。即操作步骤,也就是算法
数据类型、常量、变量及运算符
在C语言中,字符受CPU处理器,位数等影响,字符长度有区别。
使用char数据类型的变量需要特别注意,,防止数 据超出值域,思考下列几个语句:
char c1= 128; //出错,数据越界(-128)
char c1= 129; //出错,数据越界(-127)
unsigned char c2= -1;//出错,数据越界(255)
-128 补码是10000000
字节影响的就是值域,一个字节8位,2个字节代表16位
常量
基本数据类型的常量-掌握
标识常量-掌握 宏定义
对应ASCII码值
一个水分子的质量约为3.0*10-23g,1夸脱水大约有 950g,编写一个程序,要求输入水的夸脱数,然后显示这么多水中包含多少水分子。
变量
变量名由字母、数字、下划线组成,不能以数字开头,不能和C的关键字重名。
<存储类型>是关键词auto、register、 static 和extern
auto说明的变量只能在某个程序范围内使用,通常在 函数体内或函数中的复合语句里。(默认是随机值)
register称为寄存器型, register变量是想将变量放入 CPU的寄存器中,这样可以加快程序的运行速度。如申请不到就使用一般内存,同auto;
static变量称为静态存储类型的变量,既可以在函数体内, 也可在函数体外说明。(默认是0)
每一次累加会保存数据,不会销毁。在内存中以固定地址存放的,而不是以堆栈方式排放, 只要程序没结束,就不会随着说明它的程序段 结束而消失,它下次再调用该函数,该存储类变量不会重新说明。类似全局变量。
extern当变量在一个文件中的函数体外说明,所有其他文件中的 函数或程序段都可引用这个变量。
extern称为外部参照引用型,使用extern说明变量 引用在其它文件中函数体外部说明的变量。
输入:vsp 文件名 打开两个文件
static修饰全局变量
static修饰的全部变量,其它文件无法使用
运算符
百分号井代表16进制,井号代表自动增加0x前缀。
输入输出专题
掌握字符输出函数的用法
掌握格式输出函数的用法
数据输出 C语言无/0语句,1/0操作由函数实现
#include <stdio.h>
字符输出函数
格式: putchar(c)
参数:c为字符常量、变量或表达式
功能:把字符c输出到显示器上
返值:正常,为显示的代码值
格式输出函数
格式: printf("格式控制串”,输出表)
-功能:按指定格式向显示器输出数据
-输出表:要输出的数据
- 格式控制串:包含两种信息
格式说明:%[修饰符]格式字符,用于指定输出。
普通字符:原样输出
//567 //ff //101 //567 //A
附加格式说明图
字符输入函数
字符输入函数getchar
- 格式: getchar()
-功能:从键盘读一字符
-返值:正常,返回读取的代码值;出错或结束键盘输 入(ctrl d),返回-1,
int怎么这个跟字符相关的地方老不用字符呢?
getchar上来就用了一个int的类型 ,这定义中getchar是用int定义的,对于一个字符来讲,ASCII码表中是0~255,用字符(0~127)来肯定范围小了。
格式输入函数
格式: scanf( “格式控制串”,地址表)
- 功能:按指定格式从键盘读入数据,存入地址表 指定 存储单元中,并按回车键结束
-返值:正常,返回输入数据个数
- 地址表:变量的地址,常用取地址运算符&
说明: 用“%c”格式符时,空格和转义字符作为有效字符输入
例子, scanf("%c%c%c",&c1,&c2,&c3);
若输入abc
则c1为a,c2为空格,c3为b
总结,输入数据时,遇以下情况认为该数据结束 遇空格、TAB、或回车 遇非法输入 遇宽度结束
垃圾处理
处理整形的时候空格,回车是当做间隔符,不会读取,但是当使用两个scanf读取时候,会把回车换行读取。产生回车符垃圾。
掌握如何处理输入函数留下的垃圾
当你输入一个5的时候,回车,默认回车符号被x接收。 回车的ASCII码值是10.
后面多打印出来一个10,所以说这个情况就是输入整数之后遗留的回车,成了垃圾符号,影响了下次符号的输入。
那么如何去回收呢?
字符串输入函数
字符串和字符的区别是不是字符串里边默认是有一个字符作为结束标志。'\0' 实际上面只能输入4个字符。用scanf接收字符串,是不能有空格的。
对于整形的输入,输入多个变量时,是不是整形数和整形数之间空格回车tab都可以?
但是用字符串的话,空格会被当成一个分隔符了。于是就输出一个a,用gets可以解决。
字符串输出函数
答:puts默认有个回车符号。
控制语句
if()~else~选择
switch选择
可以和if搭配使用。
Switch中的表达式可以是整型int、字符型short、或者枚举enum。
while循环
goto语句
while语句
do--while 至少循环一次
打印出所有的 “水仙花”数。“水仙花”数 。 是指一个3位数,其各个位数字立方和等于该 数本身。
除了c语言中的库,其他库要手动连接。
for循环
九九乘法表
puts是打印一个字符串,默认有一个"\n"
利用for循环打印下面的图案?(大小写)
辅助语句
掌握break语句的用法
break只能跳出一层循环。
素数 在一个大于1的自然数中,除了1和此整数自身无法被其他自然数整除的数。
掌握continue语句的用法
结束本次循环,接着判定下一次是否执行循环
continue只结束本次循环,而break终止本层循环
掌握return语句的用法
return语句的一般形式: return (<表达式>)
主要用于终止包含它的函数的执行
若终止的为主函数,则主程序结束
数组
一维数组
注意事项 C语言对数组不作越界检查),
使用时要注意 int a[5]; a[5] = 10
关于用变量定义数组维数 inti= 15; int a[i]
求数组的元素个数;
冒泡排序
二维数组
二维数组的定义 -定义方式:(声明时列数不能省略,行数可以)(多对多)
数据类型 数组名[常量表达式][常量表达式] 例int a[3][4]; float b[2][5]; int c[2][3][4];
实际应用
字符数组
字符数组是元素的数据类型为字符类型的数组
-char c[10], ch[3][4];
字符数组的初始化
-逐个字符赋值
0=\0=null
-用字符串常量
下面为什么arr1打印出来6个,多出来的abc就是arr2的。答:数组的存储是连续的。
二维字符数组
C语言中无字符串变量,用字符数组处理字符串 字符串结束标志:‘\0’
输入一个字符串,然后将其逆序输出
指针
存储类型一般auto用的最多。这里先不讲
先声明一个指针,存一个地址
p是一个变量,存着地址,相当于快递员,a存着变量,相当于户主。
指针加星号相当于解地址,可以知道变量。
思考 什么叫指针? 指针占几个字节?
内存以字节为单位开始编号,这个编号就是地址,在C语言中,内存的地址就叫指针。
32位操作系统指针占4个字节,64位为8个字节。指针占的内存是操作系统跟内存之间到底是有多少根地址线决定,是由操作系统来决定的。
详解内存
指针运算
两指针之间的关系运算表示它们指向的地址位置 之间的关系。指向地址大的指针大于指向地址小 的指针。 指针与一般整数变量之间的关系运算没有意义。 但可以和零进行等于或不等于的关系运算,判断 指针是否为空。
指针运算的本质是什么?
地址的运算。
指针加1,移动多少字节?
移动n个目标数据,你的目标数据的类型决定了你这个指针加一移动几个字节。如果是整型就是4个,double就是8个。
指针与数组
设指针变量px的地址值等于数组指针x(即指 针变量px指向数组的首元数),
则: x[i]、*(px+i)、*(x+i) 和px[i]具有完全 相同的功能:访问数组第i+1个数组元素。
注意:指针星号的意思是数据类型
编写一个函数,将整形数组中n个 数按反序存放
输出的是9
指针与二维数组
多维数组就是具有两个或两个以上下标的数组 在C语言中,二维数组的元素连续存储,按行优先存
编程实现,使用一级指针(一个星号就是一级指针,两个星号就是二级指针)遍 历二维数组
改进一下。
二维数组名代表数组的起始地址,数组名加1,是移 动一行元素。因此,二维数组名常被称为行地址
字符指针与字符串
不利用任何字符串函数,编程实 现字符串连接函数的功能。