前言
这周是我正式开始学习嵌入式的第一周,首先学习了c语言环境的安装,简单的了解了Linux,然后学习了c语言程序设计的部分内容。下面是对这周学习内容的一些总结和我的个人理解,如有不对之处还请指出。
Linux
Linux优点:
1)开放性;
2)完全免费;
3)多用户;
4)多任务;
5)良好的用户界面;
6)设备独立性;
7)提供了丰富的网络功能;
8)可靠的系统安全性;
9)良好的可移植性;
国产操作系统
统信UOS
麒麟OS
Linux常用命令
这里列出了一部分
ls -l:以列表形式显示文件详细信息
ls -a:显示指定目录下所有子目录与文件,包括隐藏文件
cd:切换工作目录
cp:拷贝文件,将给出的文件或目录复制到另一个文件或目录中
mv:移动文件,用户可以使用mv命令来移动文件或目录,也可以给文件或目录重命名
touch:用于修改文件或者目录的时间属性,包括访问时间和修改时间,若文件不存在,系统会建立一个新的文件
mkdir:创建目录,参数-p可递归创建目录
pwd:显示当前路径
clear:清屏(快捷键:ctrl+l)
命令使用技巧
~:表示家目录
/:根目录
./:当前目录
../:上一级目录
双击Tab建:自动补全内容,如果没有提示表示路径错误
选中内容表示复制,按滚轮表示粘贴内容
ctrl+shift+加号:终端界面变大
ctrl+减号:终端界面变小
文件类型
-:普通文件 例如 : .txt .doc .c .cpp 音视频文件,图片文件...
d:目录文件(文件夹)
p:管道文件(进程间通信,两个程序之间通信,只能在同一台主机上通信)
s:套接字文件(网络文件,进程间通信,两个程序之间通信,可以在不同主机上通信)
c:字符设备文件(驱动文件)
b:块设备文件(驱动文件)
l:软链接文件(快捷方式)
总结:
linux有七种类型的文件
在linux中,一切皆文件
C语言
c语言是让人与机器沟通的桥梁
程序的组成
下面以程序为例
//没有头文件不会出现编译错误,但是会出现编译警告,提示隐式声明
//extern的意思是函数声明,告诉编译器等一下我使用printf的时候不要警告
//extern int printf(const char *_restrict_format,...);
#include <stdio.h>
//main是程序的入口地址,是老板
int main()
{//程序工作的范围,边界,不能离开{}独立工作,所以一个工程只有一个main
//函数,函数其实就是帮助我们实现某个功能
//printf帮我们输出hello到屏幕
printf("hello\n");
return 0;//程序结束,return 0表示正常退出
}
printf讲解
下面以程序为例
#include <stdio.h>
int main(int srgc,char const *argv[])
{
printf("hello world\n");
//%d格式输出符表示输出的内容是整数
printf("%d,%d\n",100,100);//输出整数
printf("%c\n",'a');//输出字符
printf("%s\n","abc");//输出字符串
printf("%d,%c,%s\n",200,'b',"abc");//输出整数,字符,字符串
printf("%f\n",3.14);//输出小数
printf("%lf\n",3.1415926);//输出双精度小数
printf("%.6lf\n",3.1415926);//%.6表示输出小数点后6位,注意进位
printf("%p","abc");//输出"abc"的地址
return 0;
}
可以在 Linux_C函数库中文手册 中查找函数使用方法
头文件<>和""使用区别
在Linux中如下,在windows里在kits找
#include <stdio.h> //<>是系统默认在/usr/include寻找stdio.h这个头文件
#include "stdio.h" //""系统默认在此程序当前目录(文件夹)寻找stdio.h如果找不到会在/usr/include寻找stdio.h这个头文件
[-Wimplicit-function-declaration]
错误:没有头文件
fork函数
这里简要介绍fork函数,可以在man手册中查询fork函数的使用方法
//此程序在ubuntu上运行
#include <stdio.h>
#include <unistd.h>
int main()
{
/*
*/
fork(); //复制进程,克隆人,双胞胎
printf("我是双胞胎\n");
return 0;
}
fork函数把一个程序一分为二,每个程序各自做自己的事情
man帮助手册
编程开发过程中,需要使用众多的系统指令,各类函数库、系统调用、各类系统脚本文件等,这些种类繁多、功能各异的信息,可以通过统一的man手册来获取第一手资料,man文档是帮助信息的权威通道,是大多数教程、书籍的知识来源。
使用man手册查询命令、函数时,一般直接在man后面接上待查条目即可,但有时候会遇到同一个待查询的条目存在于多个man分册的情况,这就需要先罗列出该条目所在的分册信息,然后再根据需要去选择帮助文档的序号。
// 查询存在于多个分册的条目:
// 先使用-f来查看有哪些分册包含了条目
gec@ubuntu:~$ man -f printf
printf (1) - format and print data
printf (3posix) - print formatted output
// 根据需要,指定查询某一册帮助分册
gec@ubuntu:~$ man 3posix printf
注意:
按 q退出
代码风格
下面以程序为例
#include <stdio.h>
int main(int argc,char const *argv[])
{
printf("总经理\n");
int a = 10;
//不管有多少个大括号,内容一定与大括号空4格
//{}是作用域范围
{
printf("研发部\n");
int b=20;
{
printf("程序员\n");
printf("a = %d\n",a);
printf("b = %d\n",b);
}
}
{
printf("销售部\n");
{
printf("销售员\n");
printf("a = %d\n",a);
//printf("b = %d\n",b);
}
}
return 0;
}
vi的使用
直接在 vsCode 中的扩展栏搜索 vim 安装即可。关于 vi 编辑器:
- 特点:
- vi的改进版本叫vim(vi’s improved version),vi和vim是同一个软件。
- vi其初衷是解放鼠标,只用键盘高效操作所有的编辑任务。
- 没有菜单,操作分成编辑模式和命令模式,除了编辑之外的操作都在命令模式下进行。
- 模式切换:
- 从命令模式 切换到 编辑模式:按i、o、a、I、O、A均可
- 从编辑模式 切换到 命令模式:按Esc。
在编辑模式中,vi 就跟普通的编辑器一样
在命令模式中,可以输入如下命令操作文本:
命令 | 效果 |
---|---|
: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) |
下面是在ubuntu中使用vi,直接输入vi a.c创建一个新文件,然后进行编辑。
在编辑模式下写程序时,Tab键默认缩进8格,如何进行修改呢?
Tab键缩进8格修改成4格,在命令模式下输入:set ts=4即可
数据类型
-
什么是数据?
有用的信息称为数据
int a = 123; // 定义一个专门用来存储整数的变量a
int = 4个字节
int在32位 /64位机中都是4字节
在计算机里面int一定不大于long
int<=long long<=long long
各数据类型大小
下面以程序为例
#include <stdio.h>
int main()
{
printf("%ldbyte\n",sizeof(char));
printf("%ldbyte\n",sizeof(short));
printf("%ldbyte\n",sizeof(int));
printf("%ldbyte\n",sizeof(long));
printf("%ldbyte\n",sizeof(long long));
printf("--------------------\n");
printf("%ldbyte\n",sizeof(float));
printf("%ldbyte\n",sizeof(double));//c++只用double
printf("%ldbyte\n",sizeof(long double));
return 0;
}
如图在不同的系统中有的数据类型大小也不一样
变量的定义
下面以程序为例
#include <stdio.h>
int main(int argc, char const *argv[])
{
// 申请2个字节空间,并取名为a,俗称定义变量a
// 空间a的内容为随机数
// a空间只能存放整数
// a空间存放的最大值为2字节的数据
short int a;
// 在同一个作用域({})下,不能出现两个同名的变量名
a = 10; // 将10存放到空间a里面
// 申请空间并将10放到里面
// 即定义变量并初始化
short b = 100;
return 0;
}
输出的格式
下面以程序为例
short b = 100;
printf("%hd\n",b);// h的意思为half即int的一半
char c = 15;
printf("%hhd\n",c);
int d = 1024;
printf("%d\n",d);// %d既能表示负数也能表示正数
unsigned int ud = 1024;
printf("%u\n",ud);// %u为无符号输出
long int le = 1000L;// L表示1000为长整型
printf("%ld\n",le);
long long int lle = 100000LL;
printf("%lld\n",lle);
float f = 3.14;
printf("%f\n",f);
double lf = 3.1415;
printf("%lf\n",lf);
// 在32位机里面,此类型越界无效
long double llf = 3.1415926;
printf("%Lf\n",llf);
int number = 19;
printf("%#o\n",number);// 八进制输出
printf("%#x\n",number);// 十六进制输出
注意:
负数在内存中以补码方式存放
正整数:补码与原码一样
-
这里用以下程序为例进行详细讲解
#include <stdio.h>
int main(int argc, char const *argv[])
{
unsigned char a = 257;
char b = 129;
printf("a:%hhu\n",a);
printf("b:%hhd\n",b);
printf("b:%hhu\n",b);
return 0;
}
%hhd带符号输出,%hhu不带符号输出
257-->1
范围是0~255,溢出2
1111 1111 +1 ---》 0000 0000 +1 ---》 0000 0001
所以得到1
用汽车里程表表示,最大值和最小值相邻,图示如下(图画的有点丑别介意)
129-->-127
范围是-128~127,溢出2
0111 1111 +1 ---》1000 0000 +1 ---》1000 0001
1000 0001 最高位是符号位,补码转换成原码后为(符号位不变,取反加一)
1111 1111 即为-127
用汽车里程表表示如下(图画的有点丑但能看明白就好)
129--->65409
最高位符号位被数据位占用,向前借位,借8位一共16位
根据%hhd算%hhu,在-127的基础上计算
1000 0000 0111 1111 (-127) ---》转换成补码
1111 1111 1000 0000 +1 ---》
1111 1111 1000 0001 = 65409
- Linux没有借位,符号位就是数据位。
c语言是强类型语言
弱类型语言:不需要手动分配空间,系统自动匹配(进行查找后还是不太明白?python是强类型语言还是弱类型语言?)
unsigned short int a = 10;float b = 3.14;char a
'猫'???一个中文占用3字节--->utf-8
一个中文占用2个字节--->GBK
进制转换
135(10)--->87(16)--->207(8)
1101 1011(2)-->219(10)
167(8)-->119(10)
E15(16)-->3605(10)
浮点数
浮点数存放在内存中
分为符号位1位,整数位8位,小数位23位,共32位4字节
小数转二进制使用最小二乘法
// 不是所有字符都有转义
'\b' : 转义字符 char ,表示退格符
'\t' : 代表Tab键
'\n' : 代表换行
'\r' : 代表光标回到起始位置
1066 : 整型 int short
99.44 : 浮点型 float
0XAA : int 十六进制
2.0e30 : float 科学计数法2.0*10^30
0x00EEABCDUL : unsigned long 十六进制
字符
字符的本质就是单字节的整型
下面以程序为例
#include <stdio.h>
int main(int argc, char const *argv[])
{
char a = 'a';
char b = 1;
char c = a + b;
printf("%c,%d\n",c,c);// b,98
char d = a - ' ';
printf("%c,%d\n",d,' ');// A,32
return 0;
}
可以查ASCII码表
转义字符
转义字符有范围,在127以内
127(10)---》177(8)
下面以程序为例
#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类型范围
char a = '\102';// 不超过177
printf("%o,%d,%c\n",a,a,a);
//printf("%o\n",'\109');//不合法,单个字符是0-7
//转义字符---十六进制'\xhh',注意x的大小为0-F
char b = '\x4f';
printf("%x,%d,%c",b,b,b);
return 0;
}
字符串
"abc\0" // 4个字节
'\0'作为结束标记
bool类型
下面以程序为例
#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;
}
常量与变量
- 概念:不可改变的内存称为常量,可以改变的内存称为变量
标准输入与输出
下面以程序为例
#include <stdio.h>
int main(int argc, char const *argv[])
{
printf("input msg : ");
int a;
float b;
//char msg;
// &a获取a的地址
scanf("%d%f",&a,&b);
printf("show msg : %d,%f\n",a,b);
return 0;
}
- scanf:是一个挑剔的人
输入的内容与存放的内容的空间类型一定要严格一致,否则不会取缓冲区的内容
- getchar():是一个不挑剔的人
它可以将输入缓冲区里面的内容不管什么类型,直接拿走
下面以程序为例
#include <stdio.h>
int main(int argc, char const *argv[])
{
printf("input msg : ");
int a;
float b;
char c;
// &a获取a的地址
// scanf不要添加任何除了格式化字符%外的所有任何字符
//scanf("%c,%d\n,%f",&c,&a,&b);
// 取到缓冲区的数据,返回实际取到的内容的个数
// 取不到缓冲区的数据,返回0
int n = scanf("%d",&a);
// 用getchar()将输入缓冲区的内容取走
char getMsg = getchar();
printf("n : %d\n",n);
printf("get msg : %c\n",getMsg);
scanf("%f",&b);
scanf("%c",&c);
printf("show msg : %d,%f,%c\n",a,b,c);
return 0;
}
这里需要注意的是,输入时必须将字符a与上一个小数连在一起输,因为如果按了空格在输入a的话,空格' '也是一个字符会被取走,导致看不见a的输出;这里的get msg是空格并不是没有,因为scanf的内容顺利输出了,getchar就没有数据需要取走,如果将它的定义改为int输出改为%d,将会看到输出32,这是空格符的ASCII码值。
以上就是我本周学习内容的总结,在学习了这些知识之后还需要自己多做练习加强巩固,一起加油吧!
标签:main,int,Linux,char,课程,printf,程序设计,include,光标 From: https://www.cnblogs.com/m9yu/p/zongjie1.html