数据结构
基本概念计算机处理的对象(数据)已经不再单纯是数值,而是研究计算机数据之间的关系,包括数据的逻辑结构和存储结构及数据的运算研究数据结构的意义:提高编程能力、可复用,维护性好,效率高
数据(Data)
数据即信息的载体,是能够输入到计算机中,且能被计算机识别、存储和处理的符号总称
数据元素(Data Element)
数据元素是数据的基本单位,又称为记录(Record)
数据结构的三要素
数据的逻辑结构表示数据运算之间的抽象关系,按每个元素可能具有直接的前趋数和直接的后继数将逻辑结构分为 ”线性结构“ 和 ”非线性结构“ 两大类集合:数据元素间除 ”同属一个集合外“ ,无其他关系。线性结构:一个对一个,如线性表、栈、队列树形结构:一对多,如树。圆形结构:多个对多个,如图
数据的存储结构存储结构:逻辑结构在计算机中的具体实现方法存储结构是通过计算机语言所编制的程序来实现,依赖于计算机语言的
顺序存储:将数据结构中各个元素按照其逻辑顺序存放于存储器一片连续的存储空间中,如C语言中的数组。
链式存储:将数据结构中各个元素分布到存储器的不同点,用地址(或链指针)方式建立他们之间的联系,在计 ...
c语言指针
什么是指针? 在计算机中内存是以字节为单位的连续编址空间,每一个字节单元对应着一个独一的编号,这个编号被称为内存单元的地址。
在特定的CPU架构下,内存地址的大小是固定的。
32位平台下地址为32个bit,即4个字节;
64位平台下地址为64个bit,即8个字节。
地址和指针:系统的内存好比带编号的小房间,地址对应着内存中的每个字节的编号,而指针也就是内存地址,它描述了数据在内存中的位置。
指针变量:指针变量本身不存储实际数据,而存储数据在内存中的地址,口语中的指针通常指的是指针变量。
指针的作用使程序简洁、紧凑、高效、有效表示复杂的数据结构、动态分配内存、能直接访问内存、方便处理字符串、得到多于一个的函数返回值
指针变量的一般形式格式:**<数据类型> * <指针变量名>;,如:int * p;**
数据类型要和这个地址中保存的数据的数据类型要保持一致其中 “ * ” 表示声明该变量是一个指针变量
指针变量的初始化可以是:已定义变量的地址、已初始化的同类型指针变量、NULL(空指针)。
注意:指针的使用一定要初始化,否则指针的地址值是不确定的 ...
标准I/O及缓冲区
标准I/O及缓冲区Linux下一切皆文件,全缓冲:当流的缓冲区无数据或无空间时才执行实际的 I/O 操作行缓冲:当输入和输出中遇到换行符(’ \n ‘)时,进行I/O 操作,当流和一个终端关联时,典型的行缓冲无缓冲:数据直接写入文件,流不进行缓冲
标准I/O预定义的3个流,程序运行时自动打开
流名称
描述符值
描述符
结构体名称
标准输入流
0
STDIN_FILENO
stdin(默认行缓冲)
标准输出流
1
STDOUT_FILENO
stdout(默认行缓冲)
标准错误流
2
STDERR_FILENO
stderr
缓冲区的大小为1kb,即1024个字节
文件的打开和关闭1FILE *fopen(const char *path, const char *mode);
path为文件路径
mode为打开方式
成功时发回FILE类型流指针,失败时返回NULL
模式参数
说明
“r” 或 “rb”
以只读的方式打开文件或二进制文件,文件必须存在
“r+” 或 “r+b”
以读写的方式打开文件或二进 ...
文件IO(系统IO)
文件IO(又称系统IO)posix(可移植操作系统接口)定义的一组函数,Linux系统下,标准IO基于文件IO实现
不提供缓冲机制,每次读写操作都会引起系统的调用,其核心概念是文件描述符
操作
标准IO
文件IO
打开文件
fopen
open
关闭文件
fclose
close
读取文件
getc、fgetc、gets、fgets、getchar、fread
read
写入文件
putc、fputc、puts、fputs、putchar、fwrite
write
文件描述符
每打开一个文件都有对应的一个文件描述符(非负整数),其从0开始分配,依次递增,进行文件IO操作时即通过文件描述符来完成
0(标准输入),1(标准输出),2(标准错误)是每个程序默认占用这三个文件描述符,后面打开的文件从3开始递增
文件IO的函数open函数用来创建或打开一个文件,在<fcntl.h>头文件中被定义
12int open(const char *pathname, int flags);int open(const char *pathname, int ...
gcc编译器和库的概念
GCC编译器gcc的编译流程:预处理、编译、汇编、链接
预处理阶段将源代码预处理生成预处理文件(*.i),此阶段主要工作是处理源代码中的预处理指令,将头文件内容插入程序中,包括宏替换、条件编译等。
1gcc -E xxx.c -o xxx.i
编译阶段将预处理文件进行编译生成汇编文件(*.s),此阶段为核心阶段,主要工作为将源代码转化为汇编语言,这一过程会对源代码进行词法和语法分析,若存在语法错误会报错并停止编译。
1gcc -S xxx.i -o xxx.s
汇编阶段将汇编文件进行汇编处理生成目标文件(*.o),此阶段是将汇编语言转换为机器语言,并生成目标文件,其包括程序的可执行代码和程序运行所需的符号表、调试信息。
1gcc -c xxx.s -o xxx.o
链接阶段将目标文件进行链接生成可执行文件,此过程是将多个目标文件和相应的库文件进行链接生成可执行文件。
1gcc xxx.o -o xxx
gcc常用选项
选项
说明
-c
只编译,不链接生成可执行文件
-o
自定义输出文件名称,不能与源文件同名
-g
产生符号调试工具
-O
对程序进行优化 ...
STM32的GPIO输出编程
使用寄存器编程进行GPIO输出(PA0口输出为例)在STM32的GPIO编程中,其本质就是通过操作寄存器来进行I/O口的控制,在STM32中,存在着许多外设且每个外设都有其对应的寄存器。
要想进行寄存器操作,首先需要知道寄存器的地址,在STM32参考手册 2.3 存储器映像 中有个寄存器组起始地址表,此处我截取本文所需的寄存器地址信息,在查阅参考手册得知,GPIOA外设是挂载在APB2总线上的,所以我们需要操作APB2外设时钟的使能寄存器以及GPIOA寄存器,操作寄存器的代码形式:*(uint32_t *)(基址+偏移量) = 位操作数。
配置时钟信号在STM32中,由于存在许多的外设,操作外设寄存器需要有时钟信号,如果所有外设均默认开启时钟将会造成资源浪费,因此为了能按需控制外设,在操作外设寄存器之前,首先需要进行时钟配置:
查阅手册得知,RCC寄存器基址为 0x40021000,APB2外设时钟使能寄存器偏移地址为 0x18,由于需要开启GPIOA时钟,因此IOPAEN位为1。
方法一:赋值操作,直接对寄存器进行赋值1*(uint32_t *)(0x4002 ...
Keil5软件配置
安装芯片支持包、配置ST项目、Compiler version 5安装
Linux文件系统及文件权限
简单介绍一下Linux的文件系统和文件类型及权限
ROS的安装与配置(Ubuntu 20.04)
Ubuntu 20.04系统上安装ROS
Python环境的搭建
Python环境及其开发工具的安装