【C语言学习笔记】(1)
一,c语言总览。
1,c语言被选择的原因
c语言在嵌入式中为主要的高级汇编语言,可直接驱动大多·数的多核心开发板。
嵌入式可以嵌入多种电子设备,帮助设备进行多种策略与行为。
由于嵌入式设备可能没有系统环境只能运行二进制机器语言,大部分需要虚拟机或解释性语言不可用,c是无系统环境嵌入式芯片普片选择。
2,c语言相关要点
环境:编辑器,编译器与编译流程,调试器,ide,(Linux相关)。
语法:数据类型与常变量,格式符(转义符)与运算符(逻辑符),数组与指针,函数与结构体(枚举体,联合体)。
关键字和常用标准函数:判断关键字,循环关键字,特殊关键字,输入输出函数,内存管理函数,数学函数。
二,环境
1.0 编辑器:
用于编辑代码的工具
2.0 编译器:
编译工具链(gcc),
2.1GCC:
广泛多平台,开源,强高,标准致性,集成工具链
2.2 流程及GCC参数:
hello.c(gcc -E)hello.i(-S).s(-C).o/.obj(gcc).exe/.out
指定输出文件名:使用-o参数。
gcc main.c -o myprogram(不指定则默认为a.out或a.exe)
编译最小单位:翻译单元(Translation Unit),通常指.c源文件+其包含的头文件。
预处理:展头文,删注释,替换宏,理条件
编译:c转汇编(查语法错误)
汇编:汇编转二进制(机器码)
链接:链接多个二进制文件打包为执行文件
2.3文件类型
- .c:源文件(Source File),包含具体实现。
- .h:头文件(Header File),包含声明、宏定义、结构体定义。
常见标准头文件:
输入输出(stdio.h);内存管理(stdlib.h);字符串(string.h);数学(math.h)
3.0 IDE:
包含编辑器,编译器,调试器,图形界面等集成环境
三,语法。
1. 0内存与数据表示 (Memory & Data)
1.1 存储单位
- 位(bit):最小信息单位,0或1。
- 字节(Byte):最小寻址单位,1 Byte = 8 bits。
- 换算:
- 1 KB = 1024 B
- 1 MB = 1024 KB
- 1 GB = 1024 MB
- 1 TB = 1024 GB
1.2 进制与转换
十进制:无 (如 10)
二进制:0b开头 (GCC 扩展)
八进制:0 开头 (如 012)
十六进制:0x 开头 (如 0xA5)
ps:1 位十六进制 = 4 位二进制 (地址常用)
- 十转二:除2取余,逆序排列。
- 二转十:按位权展开求和。
1.3 字节序 (Endianness)
- 小端序(Little-Endian):低地址存低位数据(x86架构常用,主机字节序)。
- 大端序(Big-Endian):低地址存高位数据(网络传输常用,网络字节序)。
1.4 负数的存储 (补码)
计算机内部统一使用补码进行运算。
- 原码:最高位为符号位(0正1负),其余位表示数值。
- 反码:
- 正数:同原码。
- 负数:符号位不变,数值位按位取反。
- 补码:
- 正数:同原码。
- 负数:反码+ 1。
- 8位有符号数范围:-128~127(1000 0000~0111 1111)
- 8位无符号数范围:0~255(0000 0000~1111 1111)
2.0变量
2.1变量的定义:
被命名并存储数据的内存地址,必须先定义或声明后使用;在定义时指定必要的名字类型与最好要有的初始值。
2.2声明:
(修饰关键字)存储类型+数据类型+名称=初始值(声明在函数外的为全局变量并全局生效,函数内的为局部变量)
2.3变量的修饰关键字:
auto默认只存活本块
const常量不可变
static静态活全程但作用受限(局部变量活全局但任函数可见,全局变量或函数仅本文件可见)
extern全局默认(外部不加,与static互斥)
register寄存(存寄存器里高频访问)
volatile易变(只能从内存读取,中断共享,多线共享,信号处理,底层延迟)
signed有符号;unsigne无符号;Short2字节整数
2.4变量类型
Char1字节字符 bool布尔(默认4字节整数)
int 4字节整数 Longlong8字节整数
Float4字节小数(默认格式科学计数) Double8字节小数
void空
四 格式符转义符与运算(符逻辑)
1.0格式符
%d(%i):有符十进;%u无符十进
%o八进;%x(X大写)16进制
%h短整;%ll长整
%f小数(%[宽度].[精度]f);%e科学格式;%g自动判断
%c字符(ascll);%s字符串;%p地址
2.0转义符
\n换行 \r回车 \t 制表 \b退格 \f换页
\a响铃 \v垂表 \\反斜 \'单引 \"双引 \?问号
\0空字
3.0运算符
3.1计算
+加 -减 *乘 /除 %取余(仅整数) =值传递
+=加完赋左 -= 减~~~ *= 乘~~~ /=除~~~
++自增 --自减(前置先加减后用,后反)
3.2逻辑
>大于 >=大于等于 <小于 <=小于等于 ==等于 !=不等于
&&与 ||或 !非(括弧提升优先级)
3.3位运算
&位与 |位或 ^位异或 ~取反 <<左移 >>右移
a?b:c判断a为真?真b假c
五 数组与指针
1.0数组
数组是一组相同数据类型的元素的集合,这些元素在内存中是连续存储的,并且通过一个唯一的数组名称和索引来访问。数组可以用来存储大量相同类型的数据,避免了定义多个变量的麻烦。(声明:数据类型+数组名[元素个数];访问:数组名[第几个元素])
int a[5];int b[5]={}; int c[]={1,2,3,4,5}; a[0]=0;1.1字符数组
char a[5]; char a[5]={'a','b','c','d','e'}; char a[]="abcde";//可以不指定长度ps:
string.h 中strlen,strcpy,strcmp函数用于处理字符串;
1.2二维数组
int a[2][2]={{0,0}, {0,0}};ps:二位数组在内存上与一维的一样是线性的
2.0指针(内存地址)
2.1内存地址
ps:stdlib.h存放
malloc,free,rand,atoi函数用于管理内存
2.2指针的定义:
指针是一个变量,它存储另一个变量的内存地址。变量存储在内存中,每个变量占据一定的内存空间,并有唯一的地址。指针就是用来存储这些地址的变量。
2.3指针的声明,引用,运算:
int a=0; int *p=&a; int arr[5] = {1, 2, 3, 4, 5}; int *p = arr;// p指向arr[0] //指针加法 p++;// p指向arr[1],即&arr[1] int arr[5] = {1, 2, 3, 4, 5}; int *p1 = &arr[3];//指向arr[3] int *p2 = &arr[0];//指向arr[0] int diff = p1 -p2;// diff = 3,表示两个元素之间有3个int的距离 if(p1>p2){return 0;}//地址可以比较,高地址比低地址大2.4二级指针:
指针的指针简单来说就是一个存储另一个指针地址的变量。假设我们有一个普通的指针,它指向某个变量的内存地址。一个指针的指针则指向这个指针的地址,从而形成一种多级引用关系。
int a=0; int *p=&a; int **pp=&p;2.5常量指针与指针常量
const int *p;//const修饰*,指地址存的不变(指针常量) int * const q;//const修饰变量q,指指针存的地址不变(常量指针)2.6指针数组与数组指针
int *a[5]={};//*修饰a[5],所以是数组指针(指向数组的指针);*(a[5]) int (*b)[]={};//*修饰的变量b,然后作为同类型变量纯数组里,即指针数组