如何妙用二级指针

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

相关推荐

Java开发者必看:5分钟搞定PaddleOCR表格识别,导出Excel和HTML超详细教程

本文为Java开发者提供了集成PaddleOCR实现智能表格识别的详细教程,包括环境配置、核心代码实现、结果导出到Excel和HTML的步骤,以及性能优化技巧。通过PaddleOCR技术,开发者可以快速将图片表格转换为结构化数据,大幅提升工作效率。

weixin_30872499的博客 101

C语言指针的使用

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

hwx1546的博客 7361

Vc出现不能连接到一个或多个 vCenter server 系统:http://vcenter-vx.utibet.edu.cn:443/sdk

问题描述: 解决办法: esxi6.7的bug 第一种通过升级系统来解决问题 第二种是通过删除数据来解决 第一步:进入到esxi的shell 第二步查看其中的服务开启状态 第二步 df -h 第三步 /opt/vmware/vpostgres/current/bin/psql -d VCDB -U postgres 第四步 SELECT nspname || '.' || relname AS "relation", pg_size_pretty(pg_total_relation_size(C.oi

m0_49328536的博客 9901

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

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

weixin_29229989的博客 2327

Veeam Backup & ONE download

前言 Veeam® Availability Suite™ 是 Veeam 的旗舰解决方案,可实现简单、灵活和可靠的数据管理。消除与数据保护、恢复、监控、勒索软件防护和合规性相关的手动流程,从而减轻数据维护压力。Veeam 能够帮助您节省时间和成本,同时支持您减少在备份方面花费的时间,将更多精力放在推动业务发展上。 Veeam Availability Suite Release 版本 包含 发布时间 复制磁力链接使用迅雷或者bittorrent ...

极致,细节 2002

【Cadence】Virtuoso@LayoutXL 差分电路版图镜像同步技巧详解

本文详细介绍了在Cadence Virtuoso LayoutXL中实现差分电路版图镜像同步的技巧,包括核心需求、环境配置、分步操作指南及高级技巧。通过使用LayoutXL的Group功能,工程师可以高效保持差分电路的对称性,提升版图迭代效率,确保高速信号处理的稳定性。特别适用于深亚微米工艺下的差分放大器设计。

weixin_29215391的博客 323

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

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

Shukuga的博客 600

Xilinx PL实现DP TX视频传输的关键配置与实战解析

本文详细解析了在Xilinx ZCU106开发板上,利用PL(可编程逻辑)实现DP TX(DisplayPort发送)视频传输的关键配置与实战流程。内容涵盖从硬件平台搭建、DP TX IP核参数(如链路速率、通道数、视频时序)的详细配置,到软件驱动初始化、中断处理及链路训练的全过程,并提供了屏幕闪烁、颜色异常等常见问题的避坑指南与调试技巧,旨在帮助开发者高效实现稳定的4K视频输出。

weixin_29165465的博客 352

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

rk3588 rkaiq_3A_server 无法解析json文件记录

rk3588 rkaiq_3A_server 无法解析json文件记录

neardi_dev的博客 1万+

OpenCV计算机视觉实战(12)——图像金字塔与特征缩放

图像金字塔技术通过对原始图像按不同分辨率进行多层次表示,不仅能提升计算效率,还能为图像融合、检测与识别提供多尺度特征。高斯金字塔 (Gaussian Pyramid) 用于构建多级低通图像,拉普拉斯金字塔 (Laplacian Pyramid) 则提取各层之间的细节信息。本节将深入介绍如何使用 OpenCV 构建高斯与拉普拉斯金字塔,并以经典的图像融合案例,展示图像金字塔在特征缩放与融合中的强大应用。

qq_30167691的博客 1404

二级指针的应用

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

weixin_42590539的博客 1015

2025华为od机试真题B卷【版本管理】JavaScript实现

在 软件版本管理中,版本号由点分割的数字组成,例如 1.2.3 和 2.8。现在,你需要编写一个函数,计算两个版本号之间的可用版本号个数。这里的可用版本号指的是所有满足 version1<x<version2的版本号x的个数。若 version1 >=version2 返回0.,

MISAYAONE的博客 254

二级指针的妙用

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

nice_guy的专栏 1738

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

字符串二级指针,妙用

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

IPGsoz的博客 1841

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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、付费专栏及课程。

余额充值