嵌入式C语言二级指针在链表中的应用

目录

重读了两本书:Stephen A.Maguire的《编程精粹:Microsoft编写优质无错C程序秘诀》和David R. Hanson的《C语言接口与实现:创建可重用软件的技术》。两本书都有对链表的操作。

假设有如图所示的链表,链表节点的pb成员指向一个缓冲块,删除节点函数根据缓冲块的首地址,找到节点并删除节点:

《编程精粹》使用一个变量pbiPrev来保存前一个节点位置,并且要处理删除的是第一个节点A这种边界条件:

void FreeBlockInfo(byte *pbToFree)
{
	blockinfo *pbi, *pbiPrev;
    pbiPrev = NULL;
	for(pbi = pbiHead; pbi != NULL; pbi = pbi->pbiNext)
	{
		if(fPtrEqual(pbi->pb, pbToFree)
		{
			if(pbiPrev == NULL)
				pbiHead = pbi->pbiHead;
			else
				pbiPrev->pbiNext = pbi->pbiNext;
			break;
		}
		pbiPrev = pbi;
	}
	/*如果pbi是NULL, 说明参数pbToFree非法*/
	ASSERT(pbi != NULL);
	/*在释放前破坏掉要释放内存中的内容*/
	memset(pbi, bGarbage, sizeof(blockinfo));
	free(pbi);
}

《C语言接口与实现》使用了二级指针,可以很巧妙的省掉变量pbiPrev以及边界判断:

void FreeBlockInfo(byte *pbToFree)
{
    blockinfo **ppbi, *pbiFind;
    pbiFind = NULL;
    for(ppbi = &pbiHead; *ppbi != NULL; ppbi = &(*ppbi)->pbiNext)
    {
        if(fPtrEqual((*ppbi)->pb, pbToFree)
		{
            pbiFind = *ppbi;
            *ppbi = (*ppbi)->pbiNext;
            break;
        }
    }
    /*如果pbiFind是NULL, 说明参数pbToFree非法*/
	ASSERT(pbiFind != NULL);
	/*在释放前破坏掉要释放内存中的内容*/
	memset(pbiFind, bGarbage, sizeof(blockinfo));
	free(pbiFind);
}

以上就是嵌入式C语言二级指针在链表中的应用的详细内容,更多关于嵌入式C语言二级指针链表的资料请关注我们其它相关文章!

(0)

相关推荐

  • c语言指针之二级指针示例

    二级指针的概念 首先任何值都有地址,一级指针的值虽然是地址,但这个地址做为一个值亦需要空间来存放,是空间就具有地址,这就是存放地址这一值的空间所具有的地址,二级指针就是为了获取这个地址,一级指针所关联的是其值(一个地址)名下空间里的数据,这个数据可以是任意类型并做任意用途,但二级指针所关联的数据只有一个类型一个用途,就是地址,指针就是两个用途提供目标的读取或改写,那么二级指针就是为了提供对于内存地址的读取或改写指针的表现形式是地址,核心是指向关系指针运算符"*"的作用是按照指向关系访问

  • C语言 一级指针与二级指针详细介绍

    指针的概念 指针就是地址, 利用这个地址可以找到指定的数据 指针就是地址, 那么在使用的时候, 常常会简单的说 指针变量为指针 指针变量就是存储地址的变量 int *p1;// 申请了一个变量, 即在内存中开辟了一块内存, 存储数据 // 开辟了 8 个字节, 在 Mac 下 指针都占 8 个字节 使用指针, 实际上应该说成使用指针变量      1> 算术运算 +1 移动几个字节? 看类型: int *,  long *,  char *     2> 获得地址表示的数据 指针里面存储的是地

  • C语言中二级指针的实例详解

    C语言中二级指针的实例详解 用图说明 示例代码: #include <stdio.h> int main(int argc, const char * argv[]) { // int a = 5; int *p1 = &a; //-打印地址-----地址相同--------------- printf("&a = %p\n", &a);// printf("p1 = %p\n", p1);// int **p2 = &p

  • 详解C语言-二级指针三种内存模型

    二级指针相对于一级指针,显得更难,难在于指针和数组的混合,定义不同类型的二级指针,在使用的时候有着很大的区别 第一种内存模型char *arr[] 若有如下定义 char *arr[] = {"abc", "def", "ghi"}; 这种模型为二级指针的第一种内存模型,在理解的时候应该这样理解:定义了一个指针数组(char * []),数组的每个元素都是一个地址. 在使用的时候,若要使用中间量操作元素,那么此时中间量应该定义为 char *tm

  • C语言 二级指针详解及示例代码

    指针可以指向一份普通类型的数据,例如 int.double.char 等,也可以指向一份指针类型的数据,例如 int *.double *.char * 等. 如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针. 假设有一个 int 类型的变量 a,p1是指向 a 的指针变量,p2 又是指向 p1 的指针变量,它们的关系如下图所示: 将这种关系转换为C语言代码: int a =100; int *p1 = &a; int **p2 = &p1; 指针变量也是一种变量

  • C语言中的指针以及二级指针代码详解

    很多初学者都对C中的指针很迷糊,希望这篇blog能帮助到大家: 1.什么是"指针": 在执行C程序的时候,由于我们的数据是存储在内存中的.所以对于C程序本身来说,如果想找到相应被调用的数据,就要知道存储该数据的内存地址是多少,换言之,C程序通过已知的内存地址到相应的内存位置存储数据. 这里简单说一下内存管理(对于初学者来说.为了避免专业术语引发的理解问题,下面的叙述尽量避免专业定义:),对于现代计算机系统来说,内存空间分为两个区域,一个是"数据区",一个是"

  • 嵌入式C语言二级指针在链表中的应用

    目录 重读了两本书:Stephen A.Maguire的<编程精粹:Microsoft编写优质无错C程序秘诀>和David R. Hanson的<C语言接口与实现:创建可重用软件的技术>.两本书都有对链表的操作. 假设有如图所示的链表,链表节点的pb成员指向一个缓冲块,删除节点函数根据缓冲块的首地址,找到节点并删除节点: <编程精粹>使用一个变量pbiPrev来保存前一个节点位置,并且要处理删除的是第一个节点A这种边界条件: void FreeBlockInfo(byt

  • 详解C语言中二级指针与链表的应用

    目录 前言 二级指针讲解 链表的应用 定义双链表的结构体 创建双链表 前言 这篇文章即将解决你看不懂或者不会写链表的基本操作的问题,对于初学者而言,有很多地方肯定是费解的.比如函数的参数列表的多样化,动态分配内存空间函数malloc等,其实这些知识和指针联系紧密,尤其是二级指针.那么开始好好的学习这篇文章吧! 二级指针讲解 简述:其实就是一个指针指向另一个指针的地址. 我们都知道指针指向地址,但是指针自身也是一个变量,当然也可以被二级指针所指向. 语法:形如 int x = 10; int *q

  • C语言中二级指针解析(指向指针的指针)

    目录 二级指针(指向指针的指针) 二级指针的定义与理解 二级指针定义格式 二级指针赋值实例 二级指针(指向指针的指针) 指针可以指向一份普通类型的数据,例如 int.double.char 等,也可以指向一份指针类型的数据,例如 int *.double *.char * 等. 如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针. 假设有一个 int 类型的变量 a,p1是指向 a 的指针变量,p2 又是指向 p1 的指针变量,它们的关系如下图所示: 将这种关系转换为C语

  • c语言中的二级指针做函数参数说明

    目录 二级指针做函数参数 二级指针作为形参简单实例分析 实例 一级指针二级指针做函数形参 下面看看实例 二级指针做函数参数 1.用指针做函数参数申请动态内存的问题 //如果函数参数是指针,不能用一级指针做函数参数实现申请动态内存   void getMemory(char *p, int num) {     p = (char *)malloc(sizeof(char)*num); } void main() {     char *str = NULL;     getMemory(str,

随机推荐