第一次在CSDN上发布关于C语言学习的内容,我把C语言学习的内容分成了十份,一天学习一部分,可能有些知识概念比较笼统,可以根据自己的需求,按照我发布的内容作为一个学习树,有一个学习的方向,去规划学习,觉得有所帮助的同学可以给个关注哦。
==第一天==
Linux的优点
-
开源 免费
-
一切皆文件
-
文件系统像是一颗倒置的树
-
多用户、多任务
1.linux基础
1.1终端的使用
-
点击桌面图标
hqyj@ubuntu:~$ 用户名@主机名:路径$ 根目录:/ 用户目录:~ == /home/hqyj
-
ctrl + alt + t ---打开新终端
默认为用户目录
-
ctrl + shift + n --- 打开新终端(当前路径)
-
ctrl + shift + t --- 新建标签
1.2命令
1.2.1 导航命令 pwd ls cd
-
pwd -- 打印当前的绝对路径
-
ls -- 将指定路径的内容输出到终端
ls [选项] 路径 注意:ls 后面缺省路径 代表打印当前路径的信息 -a :查看所有内容(包含隐藏文件) 隐藏文件:在Linux一些以.开头的文件,一般为配置文件 -l :查看文件的详细信息 ls -la == ll linux七大文件类型:lsp-bcd l:链接文件 s:套接字文件 p:管道文件 -:普通文件 --- 保存的字符 b:块设备文件 c:字符设备 --- /dev d:目录文件 --- 文件夹
-
cd -- change directory -- 进入如指定的路径
cd 路径 注意:只能进入目录文件 ..:上一级目录
1.2.2 目录文件命令
-
mkdir -- 创建目录文件
mkdir 文件名(不能有*?) mkdir -p 文件名1/文件名2/... -- 同时创建多级子目录
-
rmdir -- 删除目录文件
-
rm -r -- 递归删除目录文件
-
rm 文件名 ---删除文件
1.2.3 普通文件命令
-
touch -- 创建普通文件
touch 文件名1 文件名2 。。。
-
rm --删除
rm 文件名1 文件名2 。。。 rm -r 删除目录
-
cat -- 将普通文件的内容输出到终端
cat 文件名
1.2.4 复制和剪切
-
cp -- 复制
复制普通文件: cp 源文件名 目标文件名 --- 将原文件里的内容复制到目标文件 复制目录文件: cp -r 源文件名 目标文件名
-
mv -- 剪切、重命名
mv 源文件名 目标文件名
1.3 编辑器
-
vim /vi
vim 1.c --- 使用vi编辑器打开1.c vi 1.c vi编辑器的配置文件:~/.vimrc 命令行模式: ↑:光标向上移动 -- k ↓:光标向下移动 -- j ←:光标向左移动 -- h →:光标向右移动 -- l yy:复制一行 nyy:复制n行 dd:剪切一行 ndd:剪切n行 p:在光标所在行的下一行开始粘贴 v:进入可视化模式 --- 进入可视化模式之后 选中内容 按= 自动调整缩进 u:撤销 命令行模式 -> 插入/编辑模式: i:从当前光标之前开始插入 a:从当前光标之后开始插入 A:从行末开始插入 o:从下一行开始插入 插入/编辑模式 ->命令行模式 :Esc 命令行模式 ->底行模式 :G :w -- 保存 :q -- 退出 :wq -- 保存并退出 :x --保存并退出 :q! -- 强制退出 :w! --强制保存 /string(字符串) -- 查找指定的字符串 -- 按n查找下一个 : s/oldString/newString -- 用newString去替换oldString : s/oldString/newString/g -- 用newString去替换oldString 替换整行 : %s/oldString/newString/g -- 替换整个文本
-
gedit
gedit 1.c
1.4编译器
-
gcc
-
作用
将源程序(xxx.c、xxx.cpp)编译成对应的机器语言。
-
方法
gcc xxxx.c --- 编译成功之后生成a.out可执行文件 ./a.out --- 运行可执行文件 gcc xxxx.c -o prog1 ./可执行文件命名 --- 运行可执行文件
步骤:
预处理
将源程序中预处理指令(#include #define)进行处理,头文件的展开,宏替换,删除注释。 gcc -E xxxx.c gcc -E xxxx.c >> backup.c 将预处理之后的内容保存到backup.c
编译
将处理之后的程序编译成汇编语言。检查语法。 gcc -S xxxx.c
汇编
将汇编文件转换成目标机器可执行的二进制语言。自动识别当前机器的体系架构,生成相应的目标文件。 gcc -c xxxx.c
链接
将多个目标文件链接到一起生成可执行文件。 gcc *.o
2.计算的组成
-
中央处理器(CPU)
执行指令,进行算术运算、逻辑运算。
-
内存
存储数据和指令。
-
输入设备、输出设备
输入设备: 向计算机输入数据的设备。鼠标键盘。。。。 输出设备: 将计算机处理之后的数据呈现给用户
-
存储设备
长期保存数据。硬盘。。。。
-
总线
计算中各部件进行数据传输。地址总线、数据总线、控制总线
3.计算机中数据的表现形式
-
十进制 -- 满十进一
255= 2 * 10^2 + 5 * 10^1 + 5 * 10^0
二进制 -- 满二进一 -- 前缀0b
1111 1111 94 ->0b0101 1110 1 * 2^6 + 0 * 2^5 + 1 * 2^4 + 1 * 2^3 + 1 * 2^2 + 1 *2^1 + 0 * 2^0 139 ->0b1000 1011
-
八进制 -- 满8进一 -- 前缀0
94 ->0 136 139 ->0b010 001 011 ->0 213
-
十六进制 -- 满16进一 -- 前缀0x 0-9 A-F
94 ->0b0101 1110->0x5E 139 ->0b1000 1011-> 0x8B
-
字符型数据
ASCII man ascii
==c语言==
1.编程规范
-
c源程序的命名方式
以.c为后缀
-
c程序从main(主函数)开始,从主函数中的第一条语句依次往后执行
#include <stdio.h>//c语言本身不提供输入输出,所有的输入输出都是通过调用标准库函数实现的 int main()//c主函数的命名必须是main { return 0;//每一条语句以英文分号结束 }
-
主函数可以带参数,最多带两个
#include <stdio.h> int main(int argc,char *argv[]) { return 0; }
-
单行注释 ---以//后面都是注释的内容
-
多行注释
/* 中间都是注释类型 */
-
条件编译
#if 0 #else #endif
-
{}
在语言中一个{}代表一个模块
2.c语言中的数据表现形式
2.1 常量(只读) -- 在程序执行过程不能被改变的数据
-
整型常量
123,-345 0x5E、0b1011 1101
-
浮点型常量
3.14,-1.2345 31.4 --->3.14 *10 ^1 ->3.14E1 0.314 ---->3.14*10 ^-1 -->3.14E-1 注意:浮点型数据都是有符号的数据
-
字符型常量
''括起来的一个字符 'a' 转义字符 --->'\n' '\t'
-
字符串常量
""括起来的多个字符 "hello world" 注意:字符串常量末尾自带一个\0作为字符串结束的标志
-
符号常量
#define PI 3.14 //在预处理之后所有出现PI的地方全部替换成3.14 预定义宏: __LINE__ --- 所在行号 --整数 __DATE__ --- 编译日期 --字符串 __func__ --- 所在函数名 --字符串 可以直接打印printf("%d\n",_LINE_);
2.2 变量
-
变量的定义
<存储类型> <数据类型> 变量名; int a; int a1,a2,a3;
-
存储类型
extern 引用类型 -- 声明 --- 扩展一个全局变量的作用范围 static 静态类型 static修饰局部变量:延长局部变量的生命周期到整个程序结束。 注意:static 修饰局部变量,只会被定义一次。 (局部static int i所在的.c文件中i只会定义一次再一次遍历到static int i会被跳过) static修饰全局变量:限制全局变量不可被同一源程序中其他文件引用 (全局static int i 只能在他所在的.c文件中运用i) auto 自动类型 -- 用来修饰局部变量 -- 代表该变量所在的内存区域在栈区 注意:在定义局部变量缺省存储类型时,该变量的存储类型自动转为auto { int a; == auto int a; } register 寄存器类型 -- 修饰局部变量时,在程序运行时直接将变量加载到寄存器上。 注意:寄存资源有限,很可能申请失败,失败之后自动转为auto volatile volatile int flag = 0; // 使用volatile修饰全局变量flag 通过一个循环不断检查flag的值,在加一个改变flag值为1的函数但不调用,直到flag被中断处理函数中修改为1。由于flag是 volatile类型的,编译器不会对其进行某些优化,以确保每次循环都重新读取flag的最新值,而不是使用之前缓存的值。 const -- 修饰只读 -- const 修的变量只能读不能写。 const int a = 0; const 修饰变量时,要注意初始化。
-
数据类型
整型: char(字符型) :1byte unsigned char: 0 -- 2 ^ 8 -1 signed char: -2^7 -- 2^7-1 short(短整型):2byte unsigned short: signed short: int(整型) :4byte long(长整型) :8byte 注意:在定义变量时如果缺省符号(unsigned、signed),默认为有符号 int a; == signed int a; 浮点型: 单精度浮点型:float:4byte 精确度:6-7位 双精度浮点型:double:8byte 精确度:15-16位
-
编码
原码:对应的机器码(带符号位) 反码: 正数的反码 就是原码不变 负数的反码 原码符号位不变其余位按位取反 补码: 正数的补码 就是原码不变 负数的补码 反码+1 注意:对于有符号数来说存储都是补码
-
变量名
标识符:程序员按照命名规则自定义的词法符号。 命名规则: 由数字、字母、下滑线_ 不能以数字开头 不能与关键字重名 注意:c语言严格区分大小写 e.g.1 1str、For、volatile、goto c语言关键字32: 存储类型: static extern register auto volatile const 6 数据类型: char short int long float double signed unsigned 8 构造类型: struct union enum 3 空类型: void 1 语句: if else switch case break continue default while do for goto return 12 求字节: sizeof 1 取别名: typedef 1
-
变量的初始化-- 在定义变量时给变量的初始化值
char ch = 'a'; int i = 10; 注意:在定义变量时如果不知道暂时要给什么初值,尽量初始化为0
-
赋值
int a; a = 10;练习:char ch = 127; ch = ch + 1; ch = 128
练习:unsigned char ch = -1;
练习:交换两个变量的值
int a = 10,b = 20; int temp = a; /// a ^= b; b ^= a; a ^= b;
-
全局变量
定义位置:定义在所有模块之外的变量 作用范围:在定义的文件之内 生命周期:整个源程序 没有初始化:0
-
局部变量
定义位置:定义在模块之内的变量 作用范围:模块之内 生命周期:从定义开始到模块结束 没有初始化:随机值
-
在不同{ }可以定义同名的变量
2023年11月28日