一、目录结构
根目录(\):linux文件系统的顶层目录,所以一切都在它之下,也从他开始
用户目录(家目录):(~ or 工作目录 or HOME)
总结:
Windouws目录像是一片森林
Linux目录像一个倒置的树
Linux系统之下,一切皆文件
注意:
1.家目录以上的目录,普通用户没有操作权限,想要操作就要在命令前面加一个sodu
2.HOME才是家目录,而home不是家目录,在home下的wym才是家目录
二、常用命令
命令格式:命令 [选项] [参数]
注意:
1.[ ]表示可以省略[选项]:功能[参数]:操作的对象
2.以上三者必须要用空格隔开
在哪里输入命令?
终端(即人机交互的界面)
打开终端:
方法一:点击终端图标
方法二:Ctrl + alt t :打开默认家目录的终端(快捷键)
打开终端后的界面说明
如果要操作家目录以上的目录,需要在指令前加sudo(给一次管理员权限)
Sudo su:切换成超级用户
pwd:显示当前路径的绝对路径
绝对路径:从根目录开始的路径
相对路径:相对于一个文件下的路径
自动补全键:Tab
清屏:clear 或 Ctrl + l
上下箭头:可以查看历史命令
ls:显示当前路径下的内容
文件颜色:
蓝色:文件夹
白色:文件
绿色:可执行文件
ls 111:显示当前路径下的文件111,然后把该目录下的内容显示出来
ls -a:显示当前路径下的所有内容,包括隐藏文件
. :表示当前目录
.. :表示上一级目录
ls -l :显示当前路径下的详细属性
touch 文件名/文件路径:新建文件,可以同时新建多个
rm:文件名/文件路径:删除文件,可以同时删除多个(数据不可以恢复)
mkdir 文件夹名:创建文件夹,可以同时创建多个文件夹
rmdir 文件夹名:删除文件夹(只能删除空文件夹)
rm -r 文件夹名:删除文件夹(空和非空都可以删除)
rm -ri 文件夹名:删除文件夹(会进行是否删除的询问)
cd :直接回到家目录
cd 相对路径或绝对路径:切换路径
cd -:回到上一次操作的目录
cp 源文件路径((被复制文件)/-r 文件夹) 复制文件的路径:复制文件或文件夹
mv 源文件/源文件夹 目的文件夹:移动
三、vim编辑器
vim 文件名:(如果文件存在则直接打开,如果文件不存在则创建完后直接打开)
三种模式:
1.命令行模式(刚进入时的模式)
2.插入模式
3.底行模式
命令行模式切换插入模式:i
插入模式切换命令行模式:esc
命令行模式切换为底行模式:shift + 冒号
底行模式下:
w:保存
wq:保存并强制退出
q!:强制退出
wq!:强制保存退出
set nu :设置行号
set nonu: 取消行号
在命令行模式下:
yy:复制(从光标的一行开始)
nyy:复制n行
p:粘贴(从光标的下一行开始粘贴)
dd:删除
ndd:删除n行
u:撤销
Ctrl + r:反撤销
四、gcc编译器
1、编译
方法一:编译:gcc 1.c 生成可执行文件叫做a.out
运行:./a.out
方法二:编译:gcc 1.c -o hello,生成的可执行文件叫做hello
运行:./hello
五、计算机的基本结构
组成:输入输出设备(如:鼠标键盘)
CPU处理器(控制器、运算器、寄存器)
存储器(分为内存和外存)
内存:工作存储器、容量较小,读写速度快,掉电数据会丢失
外存:长期保存数据,容量大,读写速度慢,掉电数据不会丢失
寄存器:CPU内部的存储器,容量小,读写速度最快
程序(计算机能够识别的一组有序的指令)
指令:计算机能够识别的操作
程序的执行步骤:编辑(vim)--->编译(gcc)--->执行--->调试
1.计算机的数据表示(进制转换)
分为:数值数据和非数值数据
非数值数据(不能直接进行运算的数据)
如:字符,图片,声音等。
ASCII(十进制):规定了每一个字节在计算机中对应的是哪八位二进制数(1byte=8bit)
每一个字符都以8bit的二进制数进行存储
数值数据(能够进行运算的数据)
二进制,十进制,八进制,十六进制;为了区分不同的进制,八进制前面加0,十六进制前面加0x
进制转换
其他进制转十进制(对应的狮子乘以其他禁止的位数次幂)
二进制转十进制:0101-------->1*2^0 + 1*2^2 = 5
八进制转十进制:055 -------->5*8^0 + 5*8^1 = 45
十进制转换为其他进制(除以其他进制的倒数取余数)
十进制转换二进制:除2倒取余 34--->0010 0010
2.基本数据类型
关键字:系统预定义含义,有特定的含义,全都是小写,不能重新敌营
数据类型:char,double,int,float,short,long,struct,union,enum,void
控制语句:if,else,while,do,for,switch,break,default,continue,goto,case
存储类型:auto,register,extern,static
const:只读
return:返回函数
signed:有符号数
unsigned:无符号数
sizeof:计算所占内存大小(单位:字节)
typedef:给已有的数据类型取别名
volatile:防止编译器优化(驱动)
标识符: 程序员自己定于,一般来定义变量名,函数名,类型名
命名范围(见名知意)
1.由数字、字母、下划线组成
2.第一个字母不能是数字
3.不能和关键字重名
注意:每一种数据类型所占大小不一样,数据类型主要是让我们合理的分配内存
有符号数和无符号数
signed:数值有正负之分,一步妈的形式存储
最高位是符号位,正数的符号位是0,负数的符号位是1
正数:原码、补码、反码都一样
unsigned:只有正数
字符型家族
值域范围:char(1byte) 1byte = 8bit
unsigned:0000 0000 -----1111 1111 0~255
signed:1000 0000-----0111 1111 -128~127
整型家族
值域范围:int(4byte) 4byte = 32bit
浮点型家族
值域范围:double(8byte):双精度浮点数,有效数的范围是15-16位
%f和%lf默认输出小数点后六位
3.转义字符
4.常量
在程序运行期间,其数值不会被改变的量
1.字符常量
‘a’ ‘b’ ‘c’
2.整型常量
3.浮点型常量
4.字符串常量
注意:字符串以‘\0’作为结束符
5.标识常量(宏)
#define 宏名 表达式
注意:1.宏名一般用大写(为了跟变量区分开),但是小写也可以
2.宏后面没有分号(宏只是单纯的替换)
5.宏函数
(既有宏的特点,又有函数的特点)
#define 函数名(形参) 函数体
注意:宏只是单纯的替换,不会考虑运算的优先级,所以每一个形参加上括号,整个表达式也加上括号。
6.变量
定义:意味着要在内存中开辟空间
如何定义一个变量?
存储类型:决定了开辟的空间存在哪一个分区
数据类型:决定了要开辟的内存空间大小
变量名:开辟空间的名字
1.局部变量
定义在函数体(任何函数体)内的变量
2.全局变量
定义在函数体外的变量
局部变量不写存储类型默认就是auto,全局变量不写就是没有。
3.存储类型
四种存储类型:auto,extern,static,register
auto:修饰的变量存储在栈区,只修饰局部变量,存储在栈区
extern:修饰的变量存储在静态区(.bss和.data统称为静态区),只能修饰全局变量
作用:告诉编译器,修饰的全局变量已在其他文件中被定义过
static:修饰的变量存储在静态区,局部变量和全局变量都可以修饰
当修饰局部变量时,延长了局部变量的生命周期,如果局部变量没有初始化,其值为0,如果初始化了,只能初始化一次。
当修饰全局变量时,只能在本文件内使用(限制了全局变量的作用域)
register:修饰的变量存储在寄存器中,只能修饰局部变量,可以提高程序运行效率。
但是最终是否存储在寄存器,取决于编译器,如果没有寄存器,则存储在栈区
4.初始化
定义变量时就对变量赋值
总结:(1)全局变量没有初始化默认值为0
(2)局部变量没有初始化时默认值是随机数(64位操作系统优化为0)
4.生命周期和作用域
生命周期:什么时候开辟空间,到什么时候释放空间
作用域:使用范围
局部变量的生命周期:从定义开始,到模块(大括号)结束
作用域:大括号内
static修饰的局部变量的生命周期:从定义开始,到程序结束
作用域:大括号内
全局变量的生命周期:从定义开始,到程序结束
作用域:整个程序
static修饰的全局变量的生命周期:从定义开始,到程序结束
作用域:本文件内
7.数据类型转换
强制类型转换(手动输入代码转换)
隐式类型转换(系统自动转换)
注意:char,short使用的时候都按照int来使用
float使用的时候都按照double来使用
竖向箭头只有进行混合运算时才进行自动转换
8.运算符
单目运算符,算术运算符,左移右移,关系运算符,按位与,异或,按位或,逻辑运算符,条件运算符,赋值
1.算术运算符
+,-,*,/,%,++,--(注意:%不能用于浮点数)
++在前,++a先自加在赋值
++在后,a++先赋值在自加
注意:如果哦++a或者a++自成立一条语句,都当做a = a + 1
2.关系运算符
>,<,>=,<=,==,!=
3.逻辑运算符
&&,||,!
表达式1 && 表达式2(有一个为假,结果就是假)
表达式1 || 表达式2(有一个为真,结果就是真)
!x(如果x为0则表示为假,输出为1,如果x为1则表示为真,输出为0)
4.sizeof运算符
sizeof(数据类型) 或者 sizeof(变量名)
5.三目运算符
表达式1?表达式2:表达式3
(先判断表达式1的值是否成立,如果成立则将表达式2的值作为整个表达式的输出值,如果不成立,则将表达式3的值作为整个表达式的值)
6.逗号运算符
表达式1,表达式2,表达式3,...,表达式n
(从左往右依次计算表达式的值,将表达式n的值作为整个表达式的值)
注意:逗号运算符的优先级最低,使用时加上括号
7.位运算符
与运算(&):全1为1,有0为0
或运算(|):有1为1,全0为0
取反(~):将1和0取反操作
异或(^):相同为0,不同为1
左移(<<):高位丢弃,地位补0
右移(>>):无符号数,低位丢弃,高 位补0
有符号数,地位丢弃,正数高位补0,负数高位补1
9.输入输出
函数:有独立功能的模块
标准的输入输出函数:scanf,printf(对变量的类型没有限制)
1.输入
2.输出
注意:1.scanf格式控制串,不要加修饰语,原样输入
2.如果输入“%d%d”时要给多个变量赋值,在格式控制符之间没有间隔,在输入时以空格,回车,tab键作为一个变量的输入结束
3.全部输入结束,必须以回车作为结束符
4.如果是“%c%c”时,在输入时不能有空格,回车,tab键,因为他们也是字符
(解决办法:在“%c%c之间加一个空格或逗号” 或 变成“%c%*c%c”,%*c表示抑制符)
3.字符的输入和输出
getchar();
返回值:从键盘得到的ASCII值
char c;
c = getchar();
ptuchar();
参数:你要输出的ASCII值
10.三大结构
1.顺序结构
语句按照一定的先后顺序去执行
2.选择结构
单分支选择语句
(先判断表达式的值,如果表达式的值为真,则执行语句)
if(表达式)
{
语句;
}
双分支选择语句
(先判断表达式的值,如果表达式的值为真,则执行语句1,否则执行语句2)
if(表达式)
{
语句1;
}
else
{
语句2;
}
多分支if语句
(从上到下依次判断表达式的值,如果表达式的值为真,则执行对应的语句)
if(表达式)
{
语句1;
}
else if
{
语句2;
}
else if
{
语句3;
}
……
else
{
语句n;
}
switch语句
(表达式不能为float,标号必须是常量,当表达式和标号相等时执行对应的语句,知道switch case语句结束为止,或碰到break语句结束)
swich(表达式)
{
case 标号1:
语句1;
case 标号2:
语句2;
……
case 标号n:
语句n;
default:
语句n+1;
}
3.循环结构
重复的去做某一件事
循环的三要素:循环的起始条件,循环的终止条件,循环变量的变化
for循环
表达式1:循环的起始条件
表达式2:循环的终止条件
表达式3:循环变量的变化
(先执行表达式1的值,然后执行表达式2的值,如果表达式2的值为真,执行循环体,然后在执行表达式3的值,如此反复,直到表达式2的值为假的时候,跳出循环体。3个表达式都可以省略,但是分号不能省略)
for(表达式1;表达式2;表达式3)
{
循环体;
}
while语句
先判断表达式是否成立,如果成立,则执行循环体,否则跳出循环
while(表达式)
{
循环体;
}
do while语句
do
{
循环体;
}
while();
总结:while和do while的区别
while先判断在执行,语句至少执行0次
do while先执行在判断,语句至少执行1次
break;
跳出循环,跳出switch语句
continue;
结束本次循环,开始下一次循环
死循环
while(1)
{
;
}
for(;1;)
{
;
}
goto语句
无条件跳转语句,一般格式为 goto 语句标号;
语句标号:按照标识符命名规范