『摘要』本文主要通过实例展示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语言二重指针的运用相关推荐

  1. C语言 函数不定长参数 - C语言零基础入门教程

    目录 一.前言 二.函数不定长参数简介 1.va_start 2.va_arg 3.va_end 三.自定义不定长参数的函数 1.va_start/va_arg/va_end 案例一 2.va_sta ...

  2. C语言 const 修饰函数参数 - C语言零基础入门教程

    C语言 const 修饰函数参数 - C语言零基础入门教程 目录 一.const 简介 1.const 修饰变量 2.const 修饰指针 3.const 修饰在函数名前面 4.const 修饰在函数 ...

  3. 数组做参数_C语言进阶之路:函数—数组参数!

    数组参数属于指针参数. 指针参数即时传址参数(或叫引用参数), 如果想在函数中修改参数的值, 这是唯一的途径. 如果把数组当作参数, 不管你愿意与否, 它就是指针, 指向第一个值的指针. 1. 数组参 ...

  4. c语言 函数多个参数,C语言函数可变参数

    C语言函数可变参数教程 可变参数的函数必须至少有一个强制参数,可选参数的类型可以变化.可选参数的数量由强制参数的值决定,或由用来定义可选参数列表的特殊值决定. 对于每一个强制参数来说,函数头部都会显示 ...

  5. C语言 函数缺省参数 - C语言零基础入门教程

    目录 一.函数简介 1.函数声明 2.函数定义 3.函数调用 4.函数形参和实参 二.函数缺省参数 1.函数全缺省参数 2.函数半缺省参数 三.注意事项 四.猜你喜欢 零基础 C/C++ 学习路线推荐 ...

  6. c语言malloc引用类型作参数,c语言中动态内存分配malloc只在堆中分配一片内存.doc...

    c语言中动态内存分配malloc只在堆中分配一片内存 .C语言中动态内存分配(malloc)只在堆中分配一片内存,返回一个void指针(分配失败则返回0),并没有创建一个对象.使用时需要强制转换成恰当 ...

  7. 字符数组和字符指针做形参(字符型指针)

    一.字符数组同时做形参和实参 有时候我们需要通过调用一个函数实现对一个传入的数组进行赋值,从而改变其值.当字符数组本质是上也是指针. void change(char p[]){strcpy(p, & ...

  8. c语言malloc引用类型作参数,C语言动态内存函数的理解和总结

    第一:内存的使用 内存可以分为以下三个主要的部分:栈区.堆区.静态区 栈区(stack):存放的是局部变量.函数的形参等都是在该区上存放的. 堆区(heap):动态内存函数开辟的空间.比如malloc ...

  9. c语言如何实现不定参数,C语言中不定参数的实现

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 但是请注意,由於 K&R C 中并不检查参数型态,so 在此是用 ANSI C 来说明,毕竟 ANSI C 是目前所有 C Compiler 都支 ...

最新文章

  1. 背景建模与前景检测1(Background Generation And Foreground Detection)
  2. springMVC web项目转springboot web项目的杂谈
  3. Java:使用DOM4j来实现读写XML文件中的属性和元素
  4. SAP Commerce Cloud Spartacus UI 修改 primary color 的方法
  5. Python基础闯关失败总结
  6. The valid characters are defined in RFC 7230 and RFC 3986问题
  7. iOS常用的忽略警告
  8. 中国首家干线物流联合创新中心成立,实施自动驾驶数据共享是否可行?...
  9. 字母’x’在CSS世界中的角色和故事
  10. SSM整合——简单的小项目实战
  11. Mac上 安装Drozer 并使用
  12. 红外接收二极管为什么正反都能通_为什么在电路板中测量二极管正反都通
  13. 我如何构建一个交互式仪表板Web应用程序以可视化拳击数据
  14. 【Trie图】Hiho4_Hihocoder
  15. syft要求低配环境 v.s. 硬件要求高配环境:报错全记录
  16. 新松GCR 系列协作机器人 用户手册 (软件部分)
  17. iOS中Block的使用注意事项
  18. linux网络分析命令:ss
  19. 财务部计算机操作规程,财务部电脑管理制度
  20. 多张图片合成PDF .

热门文章

  1. 2019最新《妙堂Javascript全套项目实战》
  2. Linux 部署 MongoDB 副本集
  3. 网关是什么,一文带你快速入门腾讯技术工程
  4. 苹果体验店:鲜为人知的乔布斯的秘密
  5. MPU6050姿态融合解算(DMP)
  6. 阿里云ecs云服务器建立wordpress个人博客教程
  7. 励志:12位早起的IT大佬们让小伙伴们都惊呆了
  8. 多模、AI 齐上阵,Deepfake 换脸术克星驾到!
  9. 升级到 iOS 16 后掉电快?更新后手机发热怎么办?
  10. Shell编程规范与变量(shell编程规范,执行脚本文件的四种方式,管道符号与重定向,shell变量的作用于类型)