数据结构之栈的顺序存储结构实现 栈的顺序存储结构实现 栈的数据元素之间的一一对应的关系可以利用顺序的存储来表示, 那么可以利用数组来实现栈数据结构.// 栈的数组实现struct stack_record;typedef struct stack_record * stack;stack init_stack(int max_elements); // 初始化操作, 建立空栈void dispose_st...
数据结构之栈的基本概念 栈的基本概念 栈是限定只能在表尾(栈顶)进行插入和删除操作的线性表, 所以栈又称为后进先出(LIFO)的线性表. 典型的栈结构如图: 重要概念: 入栈 push: 入栈也称压栈, 指的是栈的插入操作, 在栈顶位置插入新的数据元素. 出栈 pop: 出栈也称弹栈, 指的是栈的删除操作, 删除栈顶位置的数据元素栈的抽象数据类型ADT stackData 每个数据元素...
数据结构之线性表的基本概念 线性表是零个或多个数据元素的有限序列. 需要注意的是: 1. 线性表中的数据元素是有顺序的 2. 线性表中数据元素的数量是有限的 3. 线性表中数据元素个数可以为零 如图按下标排序的数据元素就可以认为是一个线性表: 线性表基本概念 线性表长度:线性表中数据元素个数称为线性表的长度, 长度为零的表称为空表. 前驱:某个数据元素的前一个数据元素称为该元素的前驱, 每个元素至多有一个...
Linux驱动之驱动的基本概念 硬件是计算机系统的底层基础,代码最终会转化为硬件上的组合逻辑与时序逻辑;应用软件调用接口完成具体的任务. 软件工程师在使用接口函数时不应该考虑接口具体是怎么实现的.驱动与底层硬件直接打交道, 按照硬件设备的具体工作方式. 读写设备的寄存器, 完成设备的轮询, 中断处理, DMA通信, 进行物理内存向虚拟内存的映射实现各种接口函数, 充当了硬件与应用软件中间的桥梁.驱动工程师负责编写驱动程序...
C语言之预处理器 预处理器在源代码编译前对其进行一些文本性质的操作, 主要任务包括删除注释, 插入被 #include 指令包含的文件的内容, 定义和替换由 #define 指令定义的符号以及确定代码的部分内容是否应该根据一些条件编译指令进行编译.#define指令 #define 指令主要有两种用法: 定义常量: #define name stuff 当源代码中出现 name 符号时都会被原封不动的替...
C语言之指向函数的指针 这里介绍了关于指向一维数组的指针, 相关内容可以参考该文. 本文将简要介绍指向函数的指针.如何声明一个指向函数的指针?void print(int num); // 声明函数void (*funptr)(int) = print; // 声明指向函数的指针, 该函数接受一个int参数, 返回void, 并用print函数的地址初始化函数指针类型的通用形式: 返回类型 (...
C语言之指向一维数组的指针 int array[5] = {1, 2, 3, 4, 5}; // 定义数组int *intptr = array; // 定义指向数组元素的指针int (*arrayptr)[5] = &array; // 定义指向数组的指针上述三条语句分别定义了数组, 指向数组元素的指针和指向数组的指针. 内存情况如图示: 对于指向数组元素的指针很好理解, 但是怎样理解 指向数组的指针...
如何自定义对象字节对齐方式? C语言中, 每个完整的对象都具有字节对齐要求. 比如基本数据类型一般参照类型本身大小字节对齐, char类型对象按1字节对齐, short类型按2字节对齐等. C11中提供了 查看 和 自定义 对象字节对齐方式的方法. 关于字节对齐见这里查看对象字节对齐方式: _Alignof 操作符用法: _Alignof(typename) 返回size_of类型的typename类型对象的对齐方式...
字节对齐 一般计算机架构中都会有地址总线和数据总线, 地址总线一般决定了机器可访问内存的大小, 比如8086PC有20条地址总线, 可访问的内存为2的20次方共1048576个字节(1MB); 数据总线则决定了机器单次读写可处理数据的大小, 8086CPU有16条数据总线, 每次可传送给CPU的数据大小最多为16位(2Byte).通常我们所说的 “计算机是64位的” “32位的系统” 等指的是机器的数据...
C语言之联合与变体记录 结构体是将一个对象(内存空间)解释为C语言中多种类型的综合. 联合 是将一个对象(内存空间)在不同时候解释为C语言中不同的类型.// 联合union { float f; int i;} fi;当使用 fi.f 时, fi所占内存中的内容将被解释为一个float数; 当使用 fi.i 时, fi所占内存中的内容将被解释为一个int类型. 注意: 如果联合的各个成员具...
C语言之位段 结构体可以用来实现 位段, 在C语言中多数情况下按照一个字节的整数倍为单位处理数据, 也就是必须是以 8位 为单位处理数据, 比如一个char为8位, 一个int可能为32位. 位段使我们可以按 “任意” 位处理数据, 比如7位, 6位等. 位段的声明如下:// 位段声明// [类型] [标识符] : [位宽表达式]struct CHAR { int32_t ch ...
C语言之结构的自引用与互引用 自引用 在一个结构内部包含一个类型为该结构本身的成员称为结构的自引用. 比如:// 结构的自引用struct self_ref { int a; struct self_ref b; char c;};这种类型的结构自引用是 非法 的, 成员b中又会包含一个self_ref结构, 如此递归下去永无止尽. 下面这种声明却是合法的:// 另一种自引用...
C语言之数组名 我们知道数组名实际上是一个指针. 问题的关键是数组名指向的内容是什么.对于一维数组来说, 数组名是指向数组第一个元素的内存空间的指针常量. 比如: int array[10]; 数组名array代表的就是array[0]的地址. array+1 代表的是array[1]的地址, 也就是说 array的步进间隔为一个int变量所占的内存空间.对于二维数组来说, 数组名是指向数组第一维元素的...
C语言之复杂结构体的访问 任意一个可以在结构外部声明的变量都可以作为结构的成员. 包括数组, 指针, 其他结构等. 对于结构成员的访问可以使用 点操作符(.) 和 箭头操作符(->) 完成. 本文举例介绍复杂结构体成员的访问. 结构体声明如下:// 创建新的结构类型Tagtypedef struct{ int num; short date[3];} Tag;// 创建新的结构类型Ms...
C语言之数组下标引用与间接引用 数组元素的访问方式有下标引用和间接访问两种. 除了优先级之外, 下标引用和间接访问完全相同. arrayname[subscript] = *(arrayname + (subscript)) 例如:int arrayname[10];int *arrayptr = arrayname + 2;arrayptr = arrayname+2 = &arrayname[2]...
C语言之指针表达式 本文主要以一个例子分析一些复杂的指针表达式. 首先定义变量如下:char ch = 'a';char &ptr_ch = &ch;char **pptr_ch = &ptr_ch;假设设备有64KB的内存, 地址标号为 0x0000~0xFFFF, 再假设执行上述代码后内存分配情况如下图: 表达式 作为右值 作为左值 ch...
C语言之安全的动态内存分配 动态内存分配最常见的错误就是忘记检查所请求的内存是否分配成功. 可以利用 宏 实现安全的动态内存分配.// alloc.h#include <stdlib.h>#define malloc 不要直接使用malloc // 直接使用malloc将无法编译#define MALLOC(num, type) (type *)alloc((num) * sizeof(type))...