c语言二重指针做参数,C语言二重指针的运用
『摘要』本文主要通过实例展示C/C++中二重指针的用法和用途,对于诸如二叉树等递归定义的数据结构有一定的指导作用。
【关键字】:C/C++、二重指针、递归
本人最近想实现一个B+树,虽然对B+树的理论有一定的认识,但由于考研花去大量时间复习功课,对C的一些细节有所遗忘,因此决定从二叉树的实现开始。但刚写完二叉树的创建函数且在编译通过之后,调试时却出现了问题。二叉树是一种递归定义的数据结构,因此其创建函数也必定是递归的。其创建函数描述如下:
图1二叉树创建函数
理论上没有错误,同时在创建二叉树时也能成功,但通过本人编写的先序遍历该二叉树时,却显示0,即空的二叉树,相关操作代码如下:
//具体的操作步骤
TREE tree = 0; //TREE为二叉树结构体的指针型别
createBinaryTree(tree);
//先序遍历
由于结果错误,因此开始调试,通过观察发现当createVinartTree(tree)操作完成后tree的属性仍然为0,即仍然tree=0。后来又通过仔细分析,发现问题出在函数的参数上。虽然该函数传入的是指针型别,属于实参,但是该函数内部主要以原指针作为操作对象,因此相对于指针来说,传入的只是结构体指针的形参。所以,在函数内部操作的只是一个副本,因此二叉树的创建失败。
为了解决这个问题,笔者决定验证自己的想法是否正确,于是写了如下一段测试代码,代码如下:
//版本1
typedef struct student {
char* name;
int age;
}Student,*STUDENT;
void getInstance(STUDENT s);
int main(){
Student* st = 0;
printf("指针st的地址=%d\n",&st);
getInstance(st);
printf("st新实例的地址=%d\n",st);
return 1;
}
void getInstance(STUDENT s){
printf("指针S的地址=%d\n",&s);
s = (Student*)malloc(sizeof(student));
printf("s新实例的地址=%d\n",s);
}
这个函数的传值形式与之前二叉树的函数差不多,因此可以类比,具体运行之后得到的记过是(如图):
图2版本1的运行结果
结果很显然,指针传入函数之后产生了一个新的副本,对副本的任何操作,都不会影响到原指针指向的结构体,与二叉树创建失败类似,目的指针的副本指向了目标结构体,产生了内存泄漏。
这个问题的解决也十分的简单,将结构体的指针作为实参传入函数即可,这样就可以直接操作目标指针,也就不会出现错误的结果。运用二重指针可以轻松实现,具体修改如下:
//版本2
typedef struct student {
char* name;
int age;
}Student,**STUDENT;
void getInstance(STUDENT s);
int main(){
Student* st = 0;
printf("指针st的地址=%d\n",&st);
getInstance(&st);
printf("st新实例的地址=%d\n",st);
return 1;
}
void getInstance(STUDENT s){
printf("指针S的地址=%d\n",s);
*s = (Student*)malloc(sizeof(student));
printf("s新实例的地址=%d\n",*s);
}
修改部分如黑体部分所示,具体的运行结果如下图:
图3版本2的运行结果
测试成功,函数内部操作的指针就是实际传入的指针,即通过二重指针实现了目标操作指针的实参传递,因此能达到预想的结果。这也说明了二重指针的实际用处。
posted on 2010-01-26 22:49 望见 阅读(1803) 评论(1) 编辑 收藏 引用 所属分类: C++
c语言二重指针做参数,C语言二重指针的运用相关推荐
- C语言 函数不定长参数 - C语言零基础入门教程
目录 一.前言 二.函数不定长参数简介 1.va_start 2.va_arg 3.va_end 三.自定义不定长参数的函数 1.va_start/va_arg/va_end 案例一 2.va_sta ...
- C语言 const 修饰函数参数 - C语言零基础入门教程
C语言 const 修饰函数参数 - C语言零基础入门教程 目录 一.const 简介 1.const 修饰变量 2.const 修饰指针 3.const 修饰在函数名前面 4.const 修饰在函数 ...
- 数组做参数_C语言进阶之路:函数—数组参数!
数组参数属于指针参数. 指针参数即时传址参数(或叫引用参数), 如果想在函数中修改参数的值, 这是唯一的途径. 如果把数组当作参数, 不管你愿意与否, 它就是指针, 指向第一个值的指针. 1. 数组参 ...
- c语言 函数多个参数,C语言函数可变参数
C语言函数可变参数教程 可变参数的函数必须至少有一个强制参数,可选参数的类型可以变化.可选参数的数量由强制参数的值决定,或由用来定义可选参数列表的特殊值决定. 对于每一个强制参数来说,函数头部都会显示 ...
- C语言 函数缺省参数 - C语言零基础入门教程
目录 一.函数简介 1.函数声明 2.函数定义 3.函数调用 4.函数形参和实参 二.函数缺省参数 1.函数全缺省参数 2.函数半缺省参数 三.注意事项 四.猜你喜欢 零基础 C/C++ 学习路线推荐 ...
- c语言malloc引用类型作参数,c语言中动态内存分配malloc只在堆中分配一片内存.doc...
c语言中动态内存分配malloc只在堆中分配一片内存 .C语言中动态内存分配(malloc)只在堆中分配一片内存,返回一个void指针(分配失败则返回0),并没有创建一个对象.使用时需要强制转换成恰当 ...
- 字符数组和字符指针做形参(字符型指针)
一.字符数组同时做形参和实参 有时候我们需要通过调用一个函数实现对一个传入的数组进行赋值,从而改变其值.当字符数组本质是上也是指针. void change(char p[]){strcpy(p, & ...
- c语言malloc引用类型作参数,C语言动态内存函数的理解和总结
第一:内存的使用 内存可以分为以下三个主要的部分:栈区.堆区.静态区 栈区(stack):存放的是局部变量.函数的形参等都是在该区上存放的. 堆区(heap):动态内存函数开辟的空间.比如malloc ...
- c语言如何实现不定参数,C语言中不定参数的实现
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 但是请注意,由於 K&R C 中并不检查参数型态,so 在此是用 ANSI C 来说明,毕竟 ANSI C 是目前所有 C Compiler 都支 ...
最新文章
- 背景建模与前景检测1(Background Generation And Foreground Detection)
- springMVC web项目转springboot web项目的杂谈
- Java:使用DOM4j来实现读写XML文件中的属性和元素
- SAP Commerce Cloud Spartacus UI 修改 primary color 的方法
- Python基础闯关失败总结
- The valid characters are defined in RFC 7230 and RFC 3986问题
- iOS常用的忽略警告
- 中国首家干线物流联合创新中心成立,实施自动驾驶数据共享是否可行?...
- 字母’x’在CSS世界中的角色和故事
- SSM整合——简单的小项目实战
- Mac上 安装Drozer 并使用
- 红外接收二极管为什么正反都能通_为什么在电路板中测量二极管正反都通
- 我如何构建一个交互式仪表板Web应用程序以可视化拳击数据
- 【Trie图】Hiho4_Hihocoder
- syft要求低配环境 v.s. 硬件要求高配环境:报错全记录
- 新松GCR 系列协作机器人 用户手册 (软件部分)
- iOS中Block的使用注意事项
- linux网络分析命令:ss
- 财务部计算机操作规程,财务部电脑管理制度
- 多张图片合成PDF .