系列文章目录
第一章:Linux初体验
第二章:c语言
前言
干货较多,建议认真观看。
提示:以下是本篇文章正文内容,下面案例可供参考
一、Linux 初体验
一.Linux的优点:
1)开放性;
2)完全免费;
3)多用户;
4)多任务;
5)良好的用户界面;
6)设备的独立性;(树莓派,小熊派,55P6818,RK3399)
7)提供了丰富的网络功能;
8)良好的可以移植性;
二.文件类型
三.Linux常用命令
1.命令使用技巧
~ :表示家目录
/ :表示根目录
./ : 当前目录
../ : 上一级目录
双击tab键 :自动补全内容(在切换长路径时,很好用),如果没有提示则路径错误
Ctrl + shift +加号 :终端界面变大
Ctrl + 减号 :终端界面变小
按向上的箭头 :调出上一次输入的命令(可以多次使用,调出更早一次的命令)
Ctrl +alt + t : 打开终端
ls / + 按两次tab 键 : 列出 /(根目录)中的所有目录(文件)
echo + “输入内容”+ >> + 目标文件名 写入文件内容
cat +文件名 查看文件内容
2.终端介绍
3.普通用户切为换超级用户
4.超级用户切换为普通用户
5.ls 列出目录里面的内容
- ls / 列出根目录里面的内容, 注意:命令与路径之间要空格
6. ls -a 列出目录信息,包含隐藏文件
隐藏文件的特点:一般是系统或软件比较重要的文件,但是又不常用,可以设置为隐藏文件
7.ls -l 详细列出目录或这文件信息
8.chmod 修改文件权限
注意:
用户,前面3个字符为一组相加及为对应的用户对文件的权限 rwx
用户组,中间3个字符为一组相加及为对应的用户对文件的权限 r-x
其它用户,末尾3个字符为一组相加及为对应的用户对文件的权限 r--
9.cd 进入某个目录
10.touch 创建文件
11. rm 删除文件
12.mkdir 创建目录
13.rm 删除目录
14.cp 复制文件(拷贝)
15.cp -r复制目录(拷贝)记得 + -r
16.mv 移动 不用加 -r
17.pwd 显示文件的绝对路径
18.gcc 某.c文件 -o a
./a
运行某个文件里的代码
19.ls --help 查看帮助
20.man 手册的使用
注意:
蓝色标体为目录,白色为文件
/mnt/hgfs/ 第一个斜杠表示根目录,第二个斜杠表示目录与目录之间的分隔符
二、c语言
1.c语言程序设计入门
1.c语言大纲
1).C语言入口main()、数据类型、变量、赋值
2).ascii码、表达式、运算符(位运算符)
3).分支流、控制流
4).数组、一维数组、二维数组、指针数组、函数指针、字符串数组 字符数组
5).指针、一级指针、二级指针、野指针、空指针
6).函数的定义、调用、声明、静态函数、字符串函数,内联函数、递归函数
7).内存管理,作用域,存储期
8).结构体、枚举、共用体
9).头文件、工程管理文件
2.程序的基本结构
2.1头文件 (#include <stdio.h>)
1).c语言程序中,任何字符(包括变量和函数)的使用,都是需要提前声明的。
2).如果程序用到了系统库函数,那么就需要包含相应的系统头文件进行声明。
声明
-
概念:对源文件外定义的某个符号进行描述的过程,称为声明
-
作用:经过声明的符号,编译器才能正确识别和编译,否则编译器不认识,无法判定语法错误
-
符号:变量、函数等。
2.2主函数
1).主函数是必须要有的,每一个语言程序都有main函数,哪怕是空的。
2).主函数的名字是固定的,叫main,这个函数名不可被挪作他用。
3).主函数是程序的入口,也就是程序开始运行的地方。
4).主函数分解如下:
// int:返回值类型,代表主函数最终的执行结果是一个整型数据
// main(void):mian是函数名,这个名字不能被挪作他用
// void是函数参数列表,可以省略
int main(void)
{
}
在Linux环境下,主函数main根据程序最终是否需要接收外部命令行参数,实际有两个版本:
// 不能接收外部命令行参数的版本 int main() { ... } // 接收外部命令行参数的版本 int main(int argc, char **argv) { ... }
2.3printf函数
功能是:向终端输出一段指定格式的数据。
// 向终端输出一段字符串
printf("hello world!\n");
1)格式控制输出符
概念:函数printf被称为格式化IO函数,因为它事按照指定格式来操作数据的。以常见的整数,浮点数和字符串为例
% d :输出十进制整数
%#o : 输出八进制整数
%#x : 输出十六进制整数
%c : 输出字符
%s : 输出字符串(字符串: 用 " "括起来,中英均可)
%f : 输出浮点数(单精度浮点数 )
%lf : 输出浮点数(双精度浮点数 )
%p : 输出地址("%p","abc")输出"abc"地址
%u : 输出无符号整数
%hd : 字节数减半
2.4return语句
int main()
{
... ...
// 一般而言,函数正常退出返回0,非正常退出返回非0
return 0;
}
注意,main函数的返回值是给上一级进程(运行中的程序)的,因此理论上讲在当前的单进程程序中,main函数的返回值究竟是多少都无所谓,因为根本没有去使用这个返回值,除非在多进程程序中,进程间才需要使用main函数的返回值来传递信息。
3.man帮助手册
// 查询存在于多个分册的条目:
// 先使用-f来查看有哪些分册包含了条目
gec@ubuntu:~$ man -f printf
printf (1) - format and print data
printf (3posix) - print formatted output
// 根据需要,指定查询某一册帮助分册
gec@ubuntu:~$ man 3posix printf
注意: 按 q退出
4.代码风格规范
参考《华为编程规范和实例》
5.vi编辑器的使用
特点:
1).vi的改进版本叫vim(vi’s improved version),vi和vim是同一个软件。
2).vi其初衷是解放鼠标,只用键盘高效操作所有的编辑任务。
3).没有菜单,操作分成编辑模式和命令模式,除了编辑之外的操作都在命令模式下进行
模式切换:
1).从命令模式 切换到 编辑模式:按i、o、a、I、O、A均可
2).从编辑模式 切换到 命令模式:按Esc。
命令:
命令 | 效果 |
---|---|
:w | 保存 |
:wq | 保存并退出 |
:q! | 放弃保存并退出 |
i | 在当前光标处插入文本,进入编辑模式 |
I | 在当前光标所在行的开头处插入文本,进入编辑模式 |
a | 在当前光标的下一个字符处插入文本,进入编辑模式 |
A | 在当前光标所在行的末尾处插入文本,进入编辑模式 |
o | 在当前光标的下一行插入文本,进入编辑模式 |
O | 在当前光标的上一行插入文本,进入编辑模式 |
yy | 复制光标所在行 |
3yy | 复制光标所在行及以下3行 |
dd | 剪切光标所在行 |
3dd | 剪切光标所在行及以下3行 |
x | 剪切光标所在的字符 |
r | 替换当前字符 |
p | 粘贴 |
u | 撤销 |
ctrl+r | 恢复撤销 |
k | 光标向上移动 |
j | 光标向下移动 |
h | 光标向左移动 |
l | 光标向右移动(小写的L) |
2.数据类型
1.数据类型分类: 整型(短整型,整型,长整型,长长整型,无符号短整型,无符号整型,无符号长整形,无符号长长整型)
什么是数据?有用的信息称为数据
数据如何存储在内存
1). 确认数据的类型 10 3.14 'a' '1' "10" "100" 'a'
2). 根据数据的类型在c语言中确认分配的数据类型 int char float double
3). 确认分配的空间是否满足数据的存放 char:1字节 short 2字节 int 4字节
比特位(bit) :二进制数,cpu计算的基本单位
-
1字节 = 8位
-
1个千字节(KB) = 1024字节
-
1M = 1024KB
-
1G = 1024M
-
1T = 1024G
32位 64位
char 1字节 1字节
int 4字节 4字节
short 2字节 2字节
long 4字节 8字节
long long 8字节 8字节
float 4字节 4字节
double 8字节 8字节
long double 12字节 16字节
格式控制符
-
int 整型:%d
-
unsigned int 无符号整型 : %u
-
short整型:%hd,h代表half,即一半的存储字节
-
long整型:%ld
-
long long整型:%lld
-
显示不同进制的前缀 : %#o、%#x
2.数据类型的取值范围
1).当编译器以整型输出的时候%d,是以补码还原的方式解读
2).当cpu将数据进行运算的时候,直接以内存中存放的方式来运行,也就是以补码 的方式参与运算
3).%u输出的时候,值区域范围:0-4294967295(有符号转为无符号的时候)
4).%hhu方式打印,值域范围:0-255
3.进制转换
4.浮点型
分类:
单精度浮点型(float),典型尺寸是4字节
双精度浮点型(double),典型尺寸是8字节
长双精度浮点型(long double),典型尺寸是16字节
占用内存越多,能表达的精度越高
float f1;//单精度
double f2;//双精度
long double f3;//长双精度
5.字符
字符本质上就是一个单字节的整型
char ch1 = 'a'; // 'a'是字符常量,代表字母a
char ch2 = '\n'; // '\n'是不可见字符常量,代表回车
6.转义字符
'\ddd' ddd 表示八进制数,打印出来的是该数字对应的ascii码
格式为'\'后面又三个数,每个数的范围在 0 - 7
printf("%c\n",'\102');// 八进制
'\xhh'hh 表示十六进制 打印出来的是该数字对应的ascii码
printf("%c\n",'\x41');//A
demo :
#include <stdio.h>
int main(int argc, char const *argv[])
{
printf("efg\a");
printf("abcd\b");
printf("efg\n");
// 转义字符---八进制'\xxx',注意x的大小为0-7
// 注意转义字符的范围一定是127以内,不要超出char类型范围
int a = '\102';
printf("%o,%d,%c\n",a,a,a);
//printf("%o\n",'\109');// 不合法,单个字符是0-7
// 转义字符---十六进制'\xhh',注意x的大小为0-F
int b = '\x4f';
printf("%x,%d,%c",b,b,b);
return 0;
}
7.字符串
// 字符串的定义方式有两种:指针和数组
char *s1 = "abcd"; // 使用字符指针来表示字符串
char s2[]= "abcd"; // 使用字符数组来表示字符串
// 注意,使用数组来定义字符串时,方括号[]里面的数字可以省略
// 不省略也可以,但必须必字符串实际占用的内存字节数要大,比如:
char s3[] = "apple";
任何字符串都以一个'\0'作为结束标记
8.布尔类型数据
概念:布尔型数据只有真、假两种取值,非零为真,零为假。
语法: bool a = 1; // 逻辑真,此处1可以取其他任何非零数值
bool b = 0; // 逻辑假 c
注意:
-
逻辑真除了 1 之外,其他任何非零数值都表示逻辑真,等价于 1。
-
使用布尔型 bool 定义变量时需要包含系统头文件 stdbool.h。
demo:
#include <stdio.h>
#include <stdbool.h>
int main(int argc, char const *argv[])
{
// 在c语言,非0为真,0为假
// bool为布尔类型,一般只有两种状态 true:真 false:假
// 作用是作为标志位,增加代码的可读性
bool flage = true;
bool flage1 = false;
printf("%d\n",flage1);
enum color{yellow=10,gree,blue,red};
printf("%d",yellow);
printf("%d",red);
return 0;
}
enum 为枚举函数
9.常量与变量
举例:
int a = 100; // a是变量,而100是常量
float f = 3.14; // f是变量,而3.14是常量
char s[] = "abcd"; // s是变量,"abcd"是常量
常量举例 | 说明 | 类型 |
---|---|---|
100 | 整型 | int |
100L | 长整型 | long |
100LL | 长长整型 | long long |
100ULL | 无符号长长整型 | unsigned long long |
3.14 | 双精度浮点型 | double |
3.14L | 长双精度浮点型 | long double |
‘a’ | 字符型 | char |
“abcd” | 字符指针(字符串) | char * |
10.标准输入
scanf(); // 格式化输入函数
注意:
1).scanf() 与 printf() 不同,scanf() 的格式控制串不可乱写,尤其是结尾处的 \n
2).用户必须完全按照 scanf() 中描述的输入格式控制串来输入数据,否则将出错。
3).scanf() 的返回值,代表成功从键盘读取的数据的个数
4).无法匹配 scanf() 指定格式的数据,将被遗留在输入缓冲区中,不会消失(getchar可以清空缓冲区)
demo: