【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.outa.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):最小信息单位,01
  • 字节(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 负数的存储 (补码)

计算机内部统一使用补码进行运算。

  1. 原码:最高位为符号位(01),其余位表示数值。
  2. 反码
    • 正数:同原码。
    • 负数:符号位不变,数值位按位取反。
  3. 补码
    • 正数:同原码。
    • 负数:反码+ 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,然后作为同类型变量纯数组里,即指针数组