Day1
1.1为啥使用虚拟机
(1)进行嵌入式开发,以来的是linux(Linux is not unix) 系统,主要以终端指令为主
(2)linux也有图形化界面,由于嵌入式编程一般只将程序移植到开发板中,无需图形化界面
(3)课程前期,需要一直使用linux系统,做到从windows向linux的转换
1.2快捷键
放大终端:ctrl shift +
缩小终端:ctrl shift -
清屏:ctrl L
历史命令:上下箭头
1.3各种Linux命令
打开终端
用户名:前一个ubuntu whoami
主机名:后一个Ubuntu hostname
:$中间位置 当前路径 默认在家目录~
查看当前路径:pwd
绝对路径:从根目录开始逐层向下查找
相对路径:以当前的位置为参照
$:普通用户 root:超级用户
Linux中一切皆文件
且有两大特殊位置:
根目录:/
家目录:/home/ubuntu ~
众多命令:
新建:
mkdir 文件夹名
touch 文件名及后缀
查看:
ls 查看当前路径下所有内容(文件名)
ls -a 查看当前路径下所有内容,包括隐藏内容
ls -l 查看当前路径下所有内容de详细信息
扩展:ls -l 1.c查看1.c文件的详细信息
文件类型 权限 链接数 用户名 组名 大小 修改时间 文件名
第一个字符:文件类型7种 bcd-lsp
b:块设备文件 /dev
c:字符设备文件
d:目录文件 文件夹
-:普通文件 .c .h .txt
l:链接文件
s:套接字文件
p:管道文件
rw-rw-r-- 文件权限 三个一组 共9个
rwx:可读可写可执行 rw-:可读可写不可执行
rwx rwx rwx
自己 组内 其他
权限值:r:4 w:2 x:1 -:0
修改文件/文件夹权限:
chmod 777 file1.c
rw- rw-r-- 664
路径切换:
下一级: cd 文件夹名字
上一级: cd ..
当前: cd .
上一次: cd -
根目录: cd /
家目录: cd ~ 或 cd /home/ubuntu 或 cd 或 cd #
复制:
文件:cp 要复制的文件 目标地址
文件夹:cp -r 要复制的文件夹 目标地址
cp和mv区别:
cp之后源文件还在;mv之后源文件不在
重命名:cp -r 要复制的文件夹 目标地址/新名字
使用cp重命名,源文件还在
移动:
mv 要移动的文件/文件夹 目标地址
重命名:mv 要移动的文件/文件夹 目标地址/新名字
删除:
文件:rm 文件名
文件夹:rm -r 文件夹名字
-f 强制删除
扩展:rmdir 只能删除空目录
打开终端:
1. 直接点击
2. ctrl shift n 打开终端,路径在当前文件夹
3. ctrl alt t 家目录
关闭终端:
1. 直接点击
2. ctrl d
3. exit
1.4vi编辑器
打开vi编辑器 vi test1.c 进入编辑器,默认是命令行模式
三种模式:
命令行模式:复制、粘贴、删除、光标移动等
插入模式:编辑代码
底行模式:保存、退出、复制、分屏、查找、替换等
边看代码,边运行:
底行模式:w保存
不看原码,直接运行:
底行模式:wq保存并退出
终端显示文件内容:cat 文件名
命令行:
复制 yy nyy(光标选中y n:行数 复制几行)
删除(剪切) dd ndd
粘贴 p
撤销 u
反撤 ctrl r
光标移动首行 gg
光标移动最后一行首行 G
光标移动行首 0
光标移动行尾 $
插入模式 i o a I O A
底行模式:
指定行复制 5,10y 复制5-10行
指定行删除 5,10d
保存 w
退出 q
保存并退出 wq
强制 !
vsp 分屏本文件
vsp 文件名 分屏打开另外一个文件
查找 /找的东西
替换 s/a1/a2 光标所在行的第一个a1替换成a2
s/a1/a2/g 光标所在行的所有a1替换成a2
%s/a1/a2/g 改变全文
1,$s/a1/a2/g 改变全文
设置行号 set nu
取消 set nonu
取消高亮 nohl
Day2
[1]vi编辑器
touch test1.c
vi test1.c
或
vi test2.c 当前路径没有test2.c文件
需要保存,自动生成test2.c
vi编辑器可以新建文件,注意保存
文件相关操作:
cat test1.c在终端查看文件的内容
head test1.c在终端查看文件内容,默认查看前十行
head -n test1.c 在终端查看文件内容de前n行
tail test1.c在终端查看文件内容,默认查看后十行
tail -n test1.c 在终端查看文件内容de后n行
#include 函数库
// #开头 预处理
// .h文件 头文件
// < .h> 系统配置文件 /usr/include
// " .h" 用户新建的头文件(一般在当前文件夹里)
int main(int argc, const char *argv[])
//main主函数,程序的入口;一个工程中主函数有且仅有一个
// 扩展:命令行参数 argc 命令行输入字符串的个数
// argv 存储命令行输入的字符串
{
printf("hello world\n");
return 0;
// 主函数中的return,是主函数的结束标志 0整数 int
// 函数的返回值要和函数的数据类型保持一致;不要返回值,函数数据类型可以定义成void
printf("hello world\n");
printf("hello world\n");
}
warning:警告,不影响程序执行
error:遇到报错之后编译结束,不会生成可执行文件
[2]vscode编辑器
终端:code 文件夹名字
[3] gcc编译器
3.1 简写:
gcc test.c 编译文件,生成a.out
./a.out
或
gcc test.c -o test(可执行文件名)
./test
3.2 完整编译 4部
1. 预处理
展开头文件,替换宏定义,删除注释
gcc -E test.c -o test.i
2. 编译
检查语法问题,有错报错,没有则继续运行生成汇编文件
gcc -S test.i -o test.s
3. 汇编
生成一个不可执行的二进制文件
gcc -c test.s -o test.o
4. 链接
链接库函数,最终生成二进制可执行文件
gcc test.o -o test(可执行文件名)
运行:./test
[4]计算机的存储单位 1024 1000
计算机最小存储单位 位bit 字节byte
1字节=8位 位:0 1
1KB=1024B 1024
1MB=1024KB
1GB=1024MB
1TB=1024GB
[5] 计算机数据表示形式
5.1 数值型数据
二进制 0 1 2:10
八进制 0-7 8:010
十进制 0-9
十六进制 0-9 a-f 16:0x10
a | b | c | d | e | f |
10 | 11 | 12 | 13 | 14 | 15 |
● 十进制转二进制:
1)短除法
2)拆分法 8421
3)计算器--->导航---->程序员
● 二转十 8421
● 二转八
一位八进制用三位二进制转
11 010 110--->0326
● 八转二
0777--->111 111 111
● 二转十六
一位十六进制用四位二进制转
1101 0110--->0xd6
● 十六进制转二进制
0xab--->10101011
5.2 非数值型数据
非数值型数据实际应用,操作的ASCII码值
man手册 一般用来查看一些命令或函数的用法
终端输入:man man
man手册查看ASCII码表:
char字符型 ' '包裹一个字符
'\0' 0 字符串结束标志
'\n' 10 换行
SPACE 32 空格
'0' 48
'A' 65
'a' 97
'2'-48=2 48--->'0'
'A'+32='a'
\转义字符 'n'字符n '\n'换行
[6] 词法符号
运算符 关键字 标识符 分隔符 标点符号
6.1关键字
存储类型:auto static extern register
数据类型:int char float short long double signed unsigned
构造数据类型:struct enum union
分支:if else switch case default for do while go to break continue
其他:void const sizeof volatile return typedef
32位:4G 64位:2^48 虚拟内存空间
栈区:由系统自动开辟,自动回收 M
堆区:程序员手动开辟空间(malloc),手动回收(free)
全局区/静态区: .bss .data
常量区:char *p="hello"
6.2 标识符
在给变量、数组、函数等命名时, 遵循标识符的命名规则:
1)由字母、数字、下划线(_)组成
2)开头不能是数字
3)不能和关键字重名
4)见名知意
helloWorld:小驼峰命名(除第一个单词外,其他单词开头大写)
HelloWorld:大驼峰命名(每个单词开头大写)
6.3 运算符
算术运算符 逻辑运算符 位运算符 关系运算符 三目运算符 赋值运算符
6.3.1 算术运算符
+ - * / % ++ --
/整数相除,结果会向下取整
int a=5/2;
printf("%d\n",a); //2
========================
float a=5/2;
printf("%f\n",a);//2.000000 默认打印小数点后六位
float b=2;
printf("%f\n",b);//2.000000
==========================
float a=5.0/2;
printf("%f\n",a); //2.500000
==========================
强制转换
float a=(float)5/2; //强制转换只在当前这一行生效
printf("%.1f\n",a); //2.500000 %.1f保留一位小数
float b=5/2;
printf("%f\n",b); //2.000000
%取余 5%2==1 13%10=3
只能用于整数运算
1234 使用/ %分别表示出 1 2 3 4
++
i++;//i=i+1;
独立成句
int a=6;
1)++a;
printf("%d\n",a); //7
2) a++;
printf("%d\n",a); //7
赋值运算
int a=6;
1)int b=++a; //+ =
printf("%d %d\n",a,b);//7 7
2)int b=a++; //= +
printf("%d %d\n",a,b);//7 6
打印语句
int a=6;
1)printf("%d\n",++a);//7
printf("%d\n",a);//7
2)printf("%d\n",a++);//6
printf("%d\n",a);//7
以下程序输出结果是
#include
int main(int argc, char *argv[])
{
int a = 10;
int b = ++a; //b=11 a=11
int c = a + (b++); //c=11+11=22 b=12
int d = b+c; //d=22+12=34
printf("%d\n",d);
return 0;
} [单选题] *
A. d = 31
B. d = 32
C. d = 33
D. d = 34
作业:
#include
int main(int argc, char *argv[])
{
int a = 10;
int b = a--; //b=10 a=9
int c = a + b + 2; //c=10+9+2=21
int d = (b--) + (++c); //d=b=10 b=9 d=10+22=32
printf("%d\n",d);
} [单选题] * 选B
A. d = 31
B. d = 32
C. d = 33
D. d = 34
输出结果为:9
k的值为011,011和11是不一样的概念,C里面,011是八进制的表现形式,011转化成十进制是9,k++是先抛出在自加,所以输出的值是9
八进制011转为二进制:001001
选:D
【有道云笔记】个人笔记
https://note.youdao.com/s/FLE3X0on