如何妙用二级指针

C语言指针进阶:揭秘二级指针与内存管理的艺术 本文深入解析了C语言中二级指针在内存管理中的关键作用。通过对比错误示例,揭示了函数参数值传递导致的内存分配失败问题,并给出正确使用二级指针的解决方案。文章详细演示了如何通过传递指针的地址(int**),在被调函数中修改主调函数的指针变量,实现动态内存的"输出"分配。同时强调内存管理的黄金法则:申请、检查、使用、释放、置空,以及防御性编程的重要性。最后总结出实用原则:修改指针内容用同级指针,修改指针本身需升一级传递地址。该技巧是C语言高效内存管理的核心技能之一。 阅读详情

如果要删除单向链表会如何做呢,很多人可能会使用一个Pre指针(很多教科书上也是如此实现的),如下代码

typedef struct node 
{     
	struct node * next;    
	.... 
} node;   
typedef bool (* remove_fn)(node const * v);  
// Remove all nodes from the supplied list for which the 
// supplied remove function returns true. 
// Returns the new head of the list. 
node * remove_if(node * head, remove_fn rm) 
{     
	for (node * prev = NULL, * curr = head; curr != NULL; )    
	{         
		node * const next = curr->next;        
		if (rm(curr))         
		{        
			if (prev)              
				prev->next = next;        
			else               
				head = next;  
			free(curr);         
		}        
		else     
			prev = curr;        
		curr = next;   
	}    
	return head; 
}
这里remove_fn由调用查提供的一个是否删除当前实体结点的函数指针,其会判断删除条件是否成立。这段代码维护了两个节点指针prev和curr,
标准的教科书写法——删除当前结点时,需要一个previous的指针,并且还要这里还需要做一个边界条件的判断——curr是否为链表头。
于是,要删除一个节点(不是表头),只要将前一个节点的next指向当前节点的next指向的对象,即下一个节点(即:prev->next = curr->next),然后释放当前节点。但是这样代码些是没能使用好指针的结果。下面代码演示了如何秒用二级指针对单链表进行删除

void remove_if(node ** head, remove_fn rm) 
{    
	for (node** curr = head; *curr; )     
	{         
		node * entry = *curr;       
		if (rm(entry))       
		{           
			*curr = entry->next;         
			free(entry);         }       
		else           
			curr = &entry->next;   
	} 
}
可以先理解下 下面这段代码:

#include <iostream>
using namespace std;



int main()
{
	list_t lA, lB, lC, lD;
	list_t ** phead = &lA.next; 

	lA.next = &lB;
	lA.a = 11;
	lA.b = 12;

	lB.next = &lC;
	lB.a = 21;
	lB.b = 22;

	lC.next = &lD;
	lC.a = 31;
	lC.b = 32;

	lD.next = NULL;
	lD.a = 41;
	lD.b = 42;

	printf("%d\n", ((list_t *)phead)->a);
	printf("%d\n", (*(list_t**)phead)->a);
	printf("%d\n", (**(list_t***)phead)->a);
	printf("%d\n", (***(list_t****)phead)->a);

	printf("%d\n", ((list_t *)phead)->b);
	printf("%d\n", (**(list_t**)phead).b);
	printf("%d\n", (***(list_t***)phead).b);
	printf("%d\n", (****(list_t****)phead).b);
	
	system("pause");
	return 0;
}
这里能这么使用 主要是Sreuct 的地址和指向下一个Struct的地址是一样的,也就是说指向下一个Struct的指针必须是放在开头 不然这么使用时会有问题的。

换言之,如果一个单向链表,next是第一个字段,我们可以用一个二级指针dummy引用一条链表上的所有节点。
struct node **dummy = &head->next;
一次解引用*dummy指向头结点head
二次解引用**dummy指向head下一个节点
三次解引用*(*(*dummy))指向第三个节点
以此类推……
如果我们需要找到从head开始的第N个节点,那么对dummy进行N次解引用即可,当然现实工程中一般不会用到这么tricky的语法糖,但使用一个变量同时引用相邻三个节点是很有用的;-)。





C语言二级指针深度解析:从内存模型到动态数据结构实战 指针是C语言中实现间接寻址和动态内存管理的核心机制,它通过存储变量地址来提供对数据的灵活访问。其原理基于计算机内存的线性地址空间,每个指针变量本身占据内存并保存目标地址值。这种间接访问的技术价值在于实现高效的数据结构操作、动态内存分配以及函数间的数据传递。在工程实践中,指针广泛应用于构建链表、树、图等动态数据结构,以及实现回调函数和模块化设计。本文聚焦于指针的指针(二级指针)这一进阶概念,它通过存储一级指针的地址,使得在函数中动态修改指针指向成为可能,这是实现动态二维数组、跨函数内存分配以及链表头指针修改等 阅读详情

相关推荐

Nuclei漏洞扫描:从零到精通的Windows实战指南

本文详细介绍了Nuclei漏洞扫描工具在Windows平台上的安装与使用教程,从基础安装到高级实战技巧全面覆盖。通过具体案例展示如何利用Nuclei的模板库快速检测常见漏洞,并提供自定义POC开发指南,帮助安全从业者高效开展漏洞扫描工作。

weixin_28683689的博客 250

C语言指针的使用

指针是C语言中比较难懂的部分,但是指针又是C语言的精华,所以指针是每个C语言开发人员都必须掌握的知识。在学指针之前先来了解变量在内存中的分布。 在上图中,定义了3个变量a、b、c,这三个变量的地址分别是0x2000,0x2004和0x2008,变量的地址就代表这个变量所在的内存位置。举个例子,在一家酒店里有三个房间,门牌号分别是0x2000,0x2004,0x2008,这里的门牌号就相当是地址,找到相应的门牌号就能找到相应的房间。那么旅客根据什么东西可以找到相应的房间呢,答案是钥匙,一把钥匙对应一个房间门

hwx1546的博客 7361

TC397 EB配置ADC软件触发:从零实现周期采样与中断处理

本文详细介绍了如何在Infineon AURIX TC397芯片上使用EB Tresos工具配置ADC软件触发,实现周期采样与中断处理。通过硬件连接、EB模块配置、代码初始化及数据处理的全流程解析,帮助开发者快速掌握ADC软件触发技术,提升嵌入式系统开发效率。

root9的博客 234

c语言dummy作为参数,C语言中的dummy函数

(1)什么是dummy函数?和其他C语言函数相同,有函数的返回值类型和形参定义,也有函数体,只是函数体内部没有任何执行语句。实际也称为空函数。(2)为什么要定义dummy函数?dummy函数可以称之为没有实现任何功能的函数,只是用来演示的。这样的现象可以让我们联想到“花瓶”一词,那C语言中dummy函数这个“花瓶”角色,它又真的是“花瓶”吗?让我们来一起看看它的作用。在程序设计初始根据项目需求会划...

weixin_29229989的博客 2327

VS配置RTKLIB(卫星定位开源代码)环境

@RTKlib代码调试教程-Visual Studio 2019 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 ##RTKLIB-rtklib_2.4.3 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 @RTKlib代码调试教程-Visual Studio 2019 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技

qq_42209977的博客 4486

AUTOSAR BswM配置实战:手把手教你用Vector Davinci Configurator搭建第一个模式管理规则

本文详细介绍了如何使用Vector Davinci Configurator工具配置AUTOSAR BswM模块,实现车身控制ECU的模式管理规则。通过实战案例,从环境准备、核心概念梳理到具体配置步骤,包括ModeRequestPort、ModeCondition、Logical Expression和Rules的构建,帮助工程师快速掌握BswM配置技巧,提升汽车电子软件开发效率。

weixin_28678831的博客 353

单链表中dummy节点设定cur指针初始值的问题

同时使用dummy节点以及current指针时,current初始值的设定

Shukuga的博客 600

跨应用服务器的自定义 IDoc 传输实战:以 CATSDB 工时为例,打通两套 SAP 系统的数据通道

本文介绍了在企业多SAP系统环境下,使用SAP ALE/IDoc技术实现工时数据跨系统传输的解决方案。文章从技术选型、系统架构到具体配置步骤进行了详细说明,重点阐述了IDoc/ALE在异步传输、全链路追踪和数据重放方面的优势。 文章详细讲解了端到端实施流程,包括Logical System配置、RFC Destination创建、Message Type定义、Segment和Basic Type设计等关键步骤。同时提供了出站封装的ABAP代码示例,强调调用MASTER_IDOC_DISTRIBUTE函数后执

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 174

Leetcode | 链表

文章目录Easy创建链表给定数组,创建链表删除删除指定节点删除指定值删除链表的中间节点(Medium)删除链表的重复元素(链表已排序)删除已排序链表有重复的元素(Medium)从尾到头打印链表 Easy 创建链表 给定数组,创建链表 创建头节点和头指针,然后移动头指针 class ListNode(object): def __init__(self,x=None): self.val = x self.next = None def List2Node(arra

qq_40933711的博客 1093

Java零基础之多线程篇:线程间如何通信?

随着计算机技术的发展,多线程编程已经成为现代软件开发中的一个重要方向。在多线程编程中,线程间的通信是一个非常关键的问题。在Java开发语言中,Java提供了一些机制来实现线程间的通信,帮助开发者协调不同线程之间的执行顺序和数据交换。本文将介绍Java多线程编程中的线程间通信的相关知识。首先,我们将从简介开始,介绍线程间通信的基本概念和原理。然后,我们将通过源代码解析的方式,深入探讨Java中实现线程间通信的方法。接着,我们将给出一些应用场景案例,展示线程间通信在实际开发中的应用。

喵手的博客 1558

069_死区效应对输出电压畸变的补偿思路

死区效应导致逆变器输出电压在过零点出现台阶畸变,引发THD升高。其本质是死区期间续流二极管钳位造成的非线性误差,与电流方向、负载大小、母线电压耦合。补偿需结合前馈(基于电流方向自适应调整偏置)与反馈(抑制残余谐波),关键在于准确判断电流方向(采用滞环滤波避免跳变)、合理设置补偿量(随负载动态调整),并注意补偿位置、极性及限幅防漂移。调试应通过差分探头、FFT频谱等手段验证效果,最终实现全负载范围内的低畸变输出。

2401_88858637的博客 22

二级指针的应用

二级指针通常用在以下情况: 传递指针的地址:当需要在函数内修改指针本身的值(即指针的地址)时,就需要使用二级指针。 动态分配内存:使用二级指针可以在函数内动态分配内存,并且可以将分配的内存地址返回给调用函数。 使用指针数组:使用二级指针可以定义指向指针的指针数组。 使用指向指针的指针实现二维数组:使用二级指针可以定义一个指针,该指针指向一个包含整型值的指针数组。 其他:二级指针还有其他应...

weixin_42590539的博客 1015

深入URP之Shader篇5: SimpleLit Shader分析(1)

本篇开始分析simple lit shader。我们通过分析unlit shader了解了URP shader的结构,以及一些基础功能。而simple lit shader包含了更多的内容。本篇开始,就不会特别仔细的逐行去分析shader文件了,只会针对pass的功能中比较有意思且之前没看到过的内容进行分析。名字为的pass,它的Tags为: 根据URP的文档:说明这是一个前向渲染路径的pass,虽然URP(至少是10.8.1版本)还没有正式支持Deferred Rendering,但URP已经为它打了很多

聚焦游戏和图形引擎开发技术 1901

二级指针的妙用

    如果我们想在另外的一个程序中改变某个指针的值,则必须勇二级指针实现.其实指针作为函数的参数时,只需要遵循一个原则就可以.即:一定要传递你要操作的对象的地址.    void getMemory(char *p, int num)    {       *p = (char *) malloc(num);    }    int main(int argc, char **argv)   

nice_guy的专栏 1738

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

字符串二级指针,妙用

在C中,字符串处理还是比较复杂的,不能直接赋值,除非是字符指针才能直接赋值。字符串通常是字符数组表示,字符数组还得用strcpy()才能赋值。 所以,在处理字符串的时候,经常会遇到二级指针。下面来总结一下自己学到的东西: 1. 字符数组和字符指针 把字符数组赋值给一个字符指针,直接赋值就可以,不需要在字符数组前加取地址符&。 2. 给字符数组赋值 不能直接用赋值符号’=‘,而是用...

IPGsoz的博客 1841

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

AutoSar ADC结果缓冲区避坑指南:从内存布局解析Adc_GetStreamLastPointer二级指针的妙用

本文深入解析AutoSar ADC模块中Adc_GetStreamLastPointer的二级指针机制,揭示其在STREAMING模式下的高效内存操作原理。通过对比Adc_ReadGroup,详细讲解如何利用直接指针访问优化汽车ECU开发中的实时性和资源利用率,并提供实战代码示例和性能优化方案。

i7j8k9l的博客 957

C语言学习:指针(三):二维数组、指针数组、数组指针、二级指针

【代码】C语言学习:指针(三),二维数组指针、二级指针。

m0_63086257的博客 756

二级指针的作用详解

二级指针的作用详解 2015年06月25日 00:37:47 majianfei1023 阅读数:47758 欢迎转载,转载请注明原文地址:http://blog.youkuaiyun.com/majianfei1023/article/details/46629065 一、概念 在如下的A指向B、B指向C的指向关系中: 首先 C是"一段内容",比如你用malloc或者new分配了一块内存,然后塞进去"一段内...

weixin_44282829的博客 283

类的指针和引用

C++是使用指针和引用最多的语言,其中的水有多深,只有开发者自己知道。本人菜鸟一枚,也是觉得这个坑太深,每次遇到他们就头疼不已,所以写个demo做个测试,把细节再挖一挖。

慢就是快,快就是慢,鱼什么时候来,是鱼的事 681

关于指针作为函数参数;一级、二级指针、指针引用——编程小总结(四)

回顾下大一的知识,加深对指针的理解

qq_42615475的博客 1395

单向链表操作中的二级指针的运用

前段时间在陈皓的博客上看到了一片关于利用二级指针删除链表的操作,讲的是利用二级指针高效的删除链表中的某个节点,当时没怎么看懂,代码太精简了。后来下来仔细的研究了一下,后来又仔细研究了>书中的有关指针的介绍,还是慢慢的理解了二级指针在链表中的妙用。 现在就谈谈二级指针在链表中的应用吧,在这里主要探讨3个函数,单向链表的快速创建,插入,删除,查找操作。 1 下面是链表的创建函数: #incl

pengqian652的专栏 1509

C/C++指针进阶:从函数指针到二级指针实战解析

指针是C/C++语言的核心概念,本质上是存储内存地址的变量。通过指针运算和间接访问,程序可以直接操作内存,实现高效的数据处理和系统级编程。理解指针函数与函数指针的区别、掌握二级指针的内存模型、合理运用const修饰符,是开发高性能系统和底层软件的关键技术。在嵌入式开发中,指针常用于寄存器映射和内存管理;在算法优化时,指针运算能提升数据访问效率。通过valgrind等工具可以检测指针常见的内存泄漏和越界问题,而restrict关键字则能帮助编译器生成更优化的代码。从图像处理到状态机实现,指针技术始终是系统编程

weixin_29758911的博客 274

掌握指针进阶:探索字符指针、数组指针和指针数组的妙用

在指针的类型中我们知道有一种指针类型为字符指针char*int main()*pc = 'w';return 0;int main()//这里是把一个字符串放到pstr指针变量里了吗?//其实不是,因为想放也放不下,pstr是四个字节,而字符串明显比四个字节大//那么pstr里面存放的到底是什么呢?return 0;代码 const char* pstr = "hello world.";特别容易让同学以为是把字符串 hello world放到字符指针pstr 里了.

深入解析C/C++编程技巧,带你探索高效开发之路 1657

【初阶C语言】指针的妙用

讲到指针,就应该要想到跟他关联的东西--地址。内存会被分成一个个小的单元,每个单元的单位是字节,所以每个内存都会有一个编号,该编号就是内存的地址,通过地址就可以找到该内存。指针的概念:指针就是地址,口头说的指针就是指针变量,用来存放地址。存放的地址其实就是内存的编号。指针变量==地址==单元编号注意:存放在指针变量中的数据,会当成地址来处理。//定义一个变量a//取出变量a的地址存放到变量p中return 0;//因为变量p存放的是地址,所以称为指针变量。

2301_77053417的博客 1215

C语言二级指针详解:从原理到实战,彻底搞懂指针的指针

指针是C语言的核心概念,而二级指针则是理解多级间接寻址的关键。在C语言值传递语义下,函数参数是原值的拷贝,若需修改指针变量本身,必须传递指针的地址,即二级指针。这一机制在动态内存分配、链表操作、二维数组创建等场景中至关重要。掌握二级指针不仅能提升代码的灵活性和效率,还能避免内存泄漏和段错误等常见问题。本文深入剖析二级指针的内存模型、典型应用与调试技巧,助你彻底攻克指针难点。

weixin_34184158的博客 343

初识指针 2.0

各位宝子们,想象你有一排房子,每栋房子里有一个人。这排房子就像是一个数组,每栋房子里的人就像是数组中的元素。现在,你手里拿着一张地图,地图上标记了每个房子的地址。这张地图就像是指针,它指向每个房子的具体位置。使用指针和数组时,你可以根据地图上的地址(指针)找到并操作对应的房子(数组元素)。如果你想找到第三个房子的人,你可以查看地图上第三个地址,然后直接去那栋房子,而不需要逐个检查每一栋房子。这节,就让我们唠嗑唠嗑数组与指针之间的爱恨纠缠吧。

H2X7_的博客 546
上一篇: 进程线程 关系
下一篇: VC++常规错误之22:warning LNK4204缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样
雪岢奇
博客等级 码龄17年 310粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值