C/C++ 二级指针与一级指针 (作用在参数传递时 VC)

C++学习笔记之二级指针&指针引用 函数参数传递就是将指赋值给入参,当入参是指针时,传递的是指针的地址,在函数内新申请一个新指针,与入参指针指向相同地址。在函数内操作的是指针指向的值。 一级指针用作函数入参数 下方代码是一级指针作为参数的案例,因为声明的MyStruct* pMyStruct01指针为null,所以指针pMyStruct01 = 0,fun01入参将0传递给MyStruct* p,所以在p没有申请空间之前p = 0,... 阅读详情

以前也经常用到指针, 最近一段时间用着用着就懵了, 做下笔记, 以防以后用到会出现这种情况, 本程序在VC上面测试用

下面是C程序:

#include <stdio.h>

typedef struct T_
{
	int a;
	struct T_* next;
}TB, *TP;


void test_malloc_1(void *p)//不成功
{
	p = (void*)malloc(sizeof(TB));
}
void test_malloc_2(void **p)//成功
{
	*p = (void*)malloc(sizeof(TB));
	((TP)*p)->a = 2;
}
void test_malloc_3(void *p)//成功,此时p中以有成功申请内存的情况下
{
	((TP)p)->next = (TP)malloc(sizeof(TB));
	((TP)p)->next->a = 3;
}

void test_free_1(void*p)
{

	free(((TP)p)->next);
	((TP)p)->next = NULL;
	free(p);
	p = NULL;
}
void test_free_2(void**p)
{

	free(((TP)*p)->next);
	((TP)*p)->next = NULL;
	free(*p);
	*p = NULL;
}
int main()
{
	void *p = NULL;
	test_malloc_1(p);
	test_malloc_2(&p);
	test_malloc_3(p);

	printf("%d, %d\n", ((TP)p)->a, ((TP)p)->next->a);
	test_free_1(p);//内存已经被释放, 只是p没有被赋空,p->next被赋空
	if(NULL == p)
	{
		printf("free ok!!\n");
	}
	test_free_2(&p);//执行到此处会蹦, 因为内存已经被释放
	if(NULL == p)
	{
		printf("free ok!!\n");
	}
	return 0;
}

C+汇编

//从传参上来讲

43:       void *p = NULL;
0040DB08   mov         dword ptr [ebp-4],0 
44:       test_malloc_1(p); //不能成功申请内存
0040DB0F   mov         eax,dword ptr [ebp-4] 
0040DB12   push        eax  //此处是把p里面装的值, 也就是0, 传进去了
0040DB13   call        @ILT+20(_test_b) (00401019)
0040DB18   add         esp,4 
//跟进函数
 p = (void*)malloc(sizeof(TB));
00401058   push        8
0040105A   call        malloc (00401290)
0040105F   add         esp,4
00401062   mov         dword ptr [ebp+8],eax//此处只是把堆上申请的内存地址编号放在了,栈上面所对应的地址编号上, 并没有放在p中;

test_malloc_2(&p);
lea         ecx,[ebp-4]
0040D94E   push        ecx//传的是地址
0040D94F   call        @ILT+10(_test_malloc_2) (0040100f)
0040D954   add         esp,4
//跟进函数
 *p = (void*)malloc(sizeof(TB));
004010A8   push        8
004010AA   call        malloc (00401290)
004010AF   add         esp,4
004010B2   mov         ecx,dword ptr [ebp+8] //ecx为栈上面的地址编号
004010B5   mov         dword ptr [ecx],eax//把堆上申请的内存地址编号, 放在栈上面所对应的地址编号的值为首地址的连续4个字节的内存单元中,即为p; 

内存释放:

void test_free_1(void*p)
{
	printf("((TP)p)->next: %x \t", ((TP)p)->next);
	//free(((TP)p)->next);
	
	//((TP)p)->next = NULL;
	printf("p: %x \n", p);
	//free(p);
	//p = NULL;
}
void test_free_2(void**p)
{
	printf("((TP)*p)->next: %x\t", ((TP)*p)->next);
	//free(((TP)*p)->next);
	//((TP)*p)->next = NULL;
	printf("*p: %x", *p);
	//free(*p);
	//*p = NULL;
}

  不管是传一级还是二级指针都是能释放内存的, 它们传进free里面的参数地址是一样的, 唯一的区别是前者不能为指针p赋NULL(p->next是可以的), 后者都可以;

一级指针, 只是把栈上面地址编号所对面的内存=0, 并没有把内存当中存的地址编号的内存=0;

二级指针, 取到栈上面地址编号所对应的内存的值, 再以值为地址取值, 把值=0;

 

总结:

在申请内存的时候我们定义函数的参数必须为二级, 也就是你要申请内存存放地址编号的地址;

test_malloc_3(void *p)这种情况也可以不用传二级指针, 也能申请成功;

在内存释放的时候我们定义的函数一级二级传递参数的时候内存都能被释放,唯一的不同是一级不能为指针p赋NULL(p->next是可以的), 二级都可以;

告别仿真报错!手把手教你为Intel MAX10 FPGA定制IBIS模型(附Allegro Skill工具) 本文详细介绍了为Intel MAX10 FPGA定制IBIS模型的完整流程,解决信号完整性仿真中的管脚映射问题。通过Allegro Skill工具自动化处理管脚信息,优化IBIS模型关键段落,提升仿真效率和精度,适用于高速数字电路设计。 阅读详情

相关推荐

ArcGIS Pro 3.0 加载天地图WMTS服务,解决偏移问题的保姆级教程(附最新Key申请流程)

本文详细介绍了在ArcGIS Pro 3.0中精准加载天地图WMTS服务的全流程,包括最新Key申请流程、解决地图偏移问题的关键配置步骤以及常见问题排查方法。通过设置`esri`参数和统一坐标参考,确保地理数据与天地图底图精确匹配,提升GIS空间分析的准确性。

weixin_28713947的博客 307

C++中二级指针(指针引用)解释总结

今日在看视频学东西时,大量用到二级指针,于是便查阅资料对指针进行了研究总结。 1. 为什么会用到指针(或引用)? 在一个函数的执行中,局部变量发生的变换不会作用在函数外(且值传递浪费内存)。因此便用到了指针(或引用)来通过地址传递从而使函数的执行结果对全局都有影响。 2. 为什么会用到二级指针(或指针引用)? a、例如一个通讯录系统,一个大的系统里面,有多个对象需要修改,而每个对象里面又有多个值需要修改,因此这里便需要通过多层指针来嵌套。即多维数组中的参数传递(此处的系统下的对象便为二级指针)。 b、对指.

小黑同学的博客 5158

基于AI Agent的数据治理实战:从架构设计到企业级落地

数据治理是确保企业数据质量、一致性与安全性的核心实践,其核心原理在于通过规范、流程与技术工具对数据进行全生命周期管理。传统人工治理模式效率低下且难以规模化,而大语言模型(LLM)与智能体(Agent)技术的发展,为数据治理的自动化与智能化带来了突破。通过将自然语言理解、任务规划与工具调用能力相结合,AI Agent能够将治理规则“代码化”与“智能化”,实现从被动响应到主动发现的模式转变。在应用场景上,AI Agent可扮演智能数据专员角色,自动执行元数据问答、数据质量探查、口径对齐等任务,显著提升数据团队效

weixin_34008805的博客 419

[C++]C/C++:二级指针、二维数组、指针数组解析

由于数组储存物理的连续性,所以可以将二维数组拉伸看做一维数组,可以由一级指针表示,再由指针偏移逐一访问各元素:int arr3[3][5] = {01,02,03,04,05,11,12,13,14,15,21,22,23,24,25};上述二维数组可以看成是由{01,02,03,04,05},{11,12,13,14,15},{21,22,23,24,25}三个数组组成。每行(横向为行)首元素为该行数组的首地址:arr[0],arr[1],arr[2];

FL1768317420的博客 1747

ESP32之 ESP-IDF + Clion 开发环境搭建(二)—— Linux版

本文介绍了 Linux 下,使用Clion IDE 用官方 ESP-IDF 开发包进行 ESP32 开发的环境搭建

Augtons 的博客 6098

【WRF数据准备】土地利用类型分类标准:USGS+MODIS IGBP 21

【WRF数据准备】土地利用类型分类标准:USGS+MODIS IGBP 21

WW、forever的博客 4476

C语言编程基础-16动态内存分配 二级指针做形参 函数指针

动态内存分配; 二级指针做形参; 函数指针; 常用标准函数 动态内存分配 动态内存分配可以在程序运行时随时分配存储位置; 动态分配的存储位置一定来自于堆这个段落; 堆中的所有存储位置需要使用语句来完成分配和回收; C语言中提供几个标准函数用来分配和回收堆中的存储位置;为了使用这些标准函数需要包含stdlib.h头文件; 1)malloc()标准函数用来动态...

halazi100 2347

SAP-ABAP:SAP采购业务核心表关联关系详解

MM(核心)、FI(财务)、SD(计划协议):PR → PO → GR → MIRO → FI过账。

baidu_35680696的博客 930

深入理解指针以及二级指针(指针的指针)

前言:本文将讲解指针的定义、指针变量和普通变量的本质区别、一级指针和二级指针的关系以及如何通过二级指针修改一级指针所指向的内存。文末还附加了两个实例,帮助读者加深对二级指针的理解。本文试图通过图表的方式,通俗地讲解指针和二级指针,让读者对此有深入的理解。阅读本文大概需要15分钟的时间。

ChainingBlocks 8631

液态神经网络(LNN):打破AI“静态快照”的连续动力学革命---AI大模型系统从零开始0029

MIT研究团队受秀丽隐杆线虫神经系统的启发,开发出革命性的液态神经网络(LNN)。该技术通过连续微分方程建模神经元动态,实现输入响应速度的自适应调节,解决了传统AI模型静态化、高能耗和低解释性的痛点。LNN具有三大突破性优势:仅需少量神经元(如20个)即可完成复杂任务;能处理非均匀时序数据;在自动驾驶、医疗监测等领域展现出卓越的适应性和鲁棒性。这项将生物智能与数学建模完美融合的技术,有望成为下一代AI的核心架构,目前已在无人机导航等场景验证了其高效性,被预测为2026年最具潜力的AI突破方向。

添柴程序猿的专栏 375

C语言参数传递(值传递、地址传递)+二级指针

参数传递 C语言参数传递一般分为:值传递和地址传递(本质上只有值传递) (注意:C语言中没有引用传递,C++才有引用传递,因为很多C语言环境是用C++编译器编译,使得C看起来支持引用传递,导致很多网上很多blog都把引用传递归为C语言参数传递的一类, 当使用Microsoft Visual C++ 2010 Express或VC6之类的编译器时使用引用传递就无法编译通过) 值传...

weixin_30326515的博客 885

如何解除“无法完成操作 因为文件包含病毒或潜在垃圾软件”

当运行软件遇到“无法完成操作 因为文件包含病毒或潜在垃圾软件”时,如何解决?控制面板-系统和安全-Windows Defender防火墙-自定义设置,将专用网络及公用网络关闭。点击后,选择“病毒和威胁防护”-管理配置。进入安全中心后,选择“病毒和威胁防护”将需要排斥的选项输入后,保存配置即可。2:打开windows安全中心。

笔者从事电信媒体开发多年,愿意将多年的开发经验分享给同行 6万+

C语言指针作为参数的传递问题

参数传递 C语言参数传递一般分为:值传递和地址传递(本质上只有值传递) (注意:C语言中没有引用传递,C++才有引用传递,因为很多C语言环境是用C++编译器编译,使得C看起来支持引用传递,导致很多网上很多blog都把引用传递归为C语言参数传递的一类, 当使用Microsoft Visual C++ 2010 Express或VC6之类的编译器时使用引用传递就无法编译通过) 单纯的理解值传递和地址传递还是很简单的,但是只要一带上指针,就有点绕晕了 博主现在也是备战考研期间,复习C语言,所以深

青春无问西东 岁月自成芳华 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

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

linux程序的参数地址,C语言参数传递(值传递、地址传递)+二级指针

参数传递C语言参数传递一般分为:值传递和地址传递(本质上只有值传递)(注意:C语言中没有引用传递,C++才有引用传递,因为很多C语言环境是用C++编译器编译,使得C看起来支持引用传递,导致很多网上很多blog都把引用传递归为C语言参数传递的一类,当使用Microsoft Visual C++ 2010 Express或VC6之类的编译器时使用引用传递就无法编译通过)值传递:形参是实参的拷贝,改变形...

weixin_42591908的博客 672

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C/C++ 一些知识点总结

临时整理的,有些可能不对。 1)如果一个类里面有const-qualifier或reference, compiler不会为它生成default copy assignment operator函数。 2) Hidden是指子类和父类有同名函数,但又没有virtual关键字。这里函数只要同名就可以了,参数并不需要match。也就是说,compiler只要在子类看到有这个函数名,即使参数不...

roufoo的博客 3399

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C/C++一些难为人知的小细节

(转自简书),再根据自己经验加以补充 一、 数据类型及运算 求补码 原码的基础上, 符号位不变, 其余各位取反, 最后+1原码转补码不考虑符号位补码转原码,符号位不参与运算取反后 + 1 == 取反前 - 1 科学计数法表示 1.8 * 10^11 --> 1.8E119.34 * 10^-3 --> 9.34E-3 相关细节 siz...

diaobin0154的博客 124

C语言知识点总结

初识C语言 2.顺序、选择和循环 for循环的变种: 练习题讲解: 函数 函数的调用: 传值和传地址的区别: 函数的嵌套调用和链式访问: 函数声明和定义: 函数的递归: 一维数组: 操作符详解: 分类: 算术操作符 移位操作符 表达式求值 操作符的属性 指针 指针是什么? 野指针 如何避免: 指针运算: 指针与数组: 二级指针:存放一级指针的地址 指针数组:本质是一个数组 - 存放指针的数组 数组指针:本质是一个指针 - 存放数组的指针 实用调试技巧 什

m0_57246577的博客 1305

《C++ Primer Plus(第六版)》(9)(第七章 函数 笔记和答案)

1.ANSI C是C语言的标准,任何C语言的编译器都在ANSI C的基础上扩充。 ANSI C几乎不能完成任何程序的开发。TC、VC等都对ANSI C进行了扩充,加入了自己的规则和库之类的。 对于函数头: void fun();在ANSI C中,意味着不指出参数,后面定义参数列表。 而C++则是表示没有函数,要是想不指出参数表,应该用省略号 void fun(...);

肥宝的实验室 3157

C语言核心语法与内存管理实战:从苏小红教材到项目开发

C语言作为一门接近底层的编程语言,其核心价值在于对计算机内存和硬件资源的直接控制能力。理解其工作原理,关键在于掌握变量、函数、指针等基本概念在内存中的表示与操作方式。例如,指针的本质是内存地址,其类型决定了编译器如何解释所指向的内存区域,这是理解数组名退化、二级指针等高级用法的基石。在工程实践中,动态内存管理(malloc/free)是C语言赋予开发者的强大工具,但同时也带来了内存泄漏、野指针等常见风险,需要配合调试工具和防御性编程来规避。这些底层原理和工程实践,使得C语言在操作系统、嵌入式系统、算法实现(

weixin_30321709的博客 373

1.c++入门基础【由浅入深-C++】

本文介绍c++入门的相关内容。

插花弄玉的博客 2万+

《C++ Primer Plus(第六版)》(第七章 函数 笔记和答案)

1.ANSI C是C语言的标准,任何C语言的编译器都在ANSI C的基础上扩充。ANSI C几乎不能完成任何程序的开发。TC、VC等都对ANSI C进行了扩充,加入了自己的规则和库之类的。 对于函数头: void fun();在ANSI C中,意味着不指出参数,后面定义参数列表。 而C++则是表示没有函数,要是想不指出参数表,应该用省略号 void fun(...); 2.C++标准使...

weixin_41275002的博客 294

易被遗忘的C/C++要点总结

感兴趣的可以加群QQ:948954484 找雅丽 领取听课链接和往期学习资料噢。 一、 数据类型及运算 求补码 原码的基础上, 符号位不变, 其余各位取反, 最后+1 原码转补码不考虑符号位 补码转原码,符号位不参与运算 取反后 + 1 == 取反前 - 1 科学计数法表示 1.8 * 10^11 --&gt; 1.8E11 9.34 * 10^-3 --&gt; 9.34E-3 相关细节 si...

228

C语言二级指针的代码实践

C语言二级指针的代码实践 #include<iostream> #include<stdlib.h> typedef struct Point{ int data; struct Point *next; } Point; //注释中是c++写法 ,三处不同 void contract(Point **x){ //Point *&x Point *p = (Point*)malloc(sizeof(Point)); Point *q = (Point*).

weixin_50351240的博客 1052

C/C++二级指针概念及应用(有向图的邻接表(拓扑排序)、有向网图的邻接表、树的孩子表示)

二级指针:指向指针的指针。一般需要修改地址的时候会用到二级指针。 注意:二级指针使用的时候,二级和一级指针都需要分配内存,单单只分配二级指针或者只分配一级指针的内存都会报错。 (直接代码解释) //有向网图的邻接表 //运用了二级指针:要直接修改地址需要用到二级指针 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<iostream> #include<malloc.h> using namesp

great_yzl的博客 395

C语言指针总结提高(野指针,一级指针)

在做项目中我们经常用到一级指针,比如传参啊,调用,字符串什么的。大家最熟悉的应该是一级指针。 1.野指针 这个词之前也听过,但是不确实是什么意思。先搜了一下百度百科,定义是: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)指针变量在定义时如果未初始化,其值是随机的,指针变量的值是别的变量的地址,意味着指针指向了一个地址是不确定的变量,此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的。 也没看大懂,找了一些例子和一些讲解,其实引起野指针有两种情况。 初始化未被置NULL

weixin_36101480的博客 857
上一篇: windows C/C++ socket 一对多(select)
下一篇: c/c++ windows 远程线程注入
__网瘾少年
博客等级 码龄11年 122粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值