这个问题是在学习链表时遇到的,在做实验二的过程中想要实现插入(或删除)操作时,我们会调用子函数传入首元结点地址作为指针形参,通过一系列变化(一般是循环)找到待处理结点后进行相应处理。

我们总能轻易地改变非首元结点之间的链式关系,处理过后首元结点地址(即指针形参)显然是不会改变的。但难免会出现新增一个结点插入在首元结点之前(或者删除掉首元结点)的情况,这时我们便想更改首元结点的地址,按照这个思路在子函数中给指针形参赋新生成结点的地址,运行结果却不尽人意。

我们发现,即使是在子函数中更改了指针形参的地址,在子函数接下来的运行中确实更改,可当子函数结束后,主函数中当初传入子函数的实参地址并未发生上述相应的改变,也就是说,我们处理首元结点仅在子函数中生了效,在主函数中“头”还是“原来的头”。

案例一:

#include <stdio.h>
#include <stdlib.h>void test(int *p)
{printf("2:%p\n",p);p=NULL;printf("3:%p\n",p);
}int main()
{int *p;p=malloc(sizeof(int));printf("1:%p\n",p);test(p);printf("4:%p\n",p);return 0;
}

测试结果:

像上述案例,我们在子函数中给指针形参NULL,在之后子函数中未结束时指针形参确实发生了改变,可当跳出子函数回归主函数时,我们发现当初传入的指针实参又恢复到刚生成时的地址,并没有因为在子函数中发生的改变而改变。

那我们如何实现修改首元结点地址(指针形参)呢?

我们可以在声明定义函数时,在其参数表中数据类型定义为“二级指针”,相应的我们给子函数传入指针的指针,放在这里来说就是传入“首元结点地址的地址”,在子函数中我们通过“二级指针”(首元结点地址的地址)修改“一级指针”(首元结点地址),这样就可避免案例一中的问题。

案例二:

#include <stdio.h>
#include <stdlib.h>void test(int **p) //这里形参为“二级指针 ”
{printf("2:%p\n",*p);*p=NULL;printf("3:%p\n",*p);
}int main()
{int *p;p=malloc(sizeof(int));printf("1:%p\n",p);test(&p);//注意这里传入的是指针p的地址 printf("4:%p\n",p);return 0;
}

测试结果:

利用上述方法我们解决了这一问题,子函数中我们通过“二级指针”修改“一级指针”后,不仅在子函数中奏效,跳出子函数回归主函数时,我们发现当初传入的指针实参确实改变了地址。

利用以上原理我们便可解决链表中各结点之间的关系问题,当处理的结点与首元结点无关,不用考虑首元结点地址的改变,当要改变首元结点地址,我们便采用上述方法。但是要注意,此时的子函数形参为二级指针,所以接下来的操作中不要忘记给传入参数名前加'*',用其一级指针进行连接删除相应操作;在主函数中调用该子函数时,记得传入的实参为二级指针,给原来的首元结点地址前加'&'。

C语言关于传入子函数的指针形参的地址改变相关推荐

  1. 子函数的指针释放问题

    C语言中遇到一个这样的问题:子函数中malloc了一个指针存储数据,作为该子函数的返回值,return到主函数. 那么这个指针应该在哪里释放呢? 显然不能在子函数里释放,否则返回值没有意义.这样就应该 ...

  2. C语言学习笔记---指向函数的指针

      在内存中函数的存放也是一段连续的内存,函数名就是指向改内存中的首地址,所以也可以将这个函数的首地址赋给一个指针变量,这样通过指针变量就可以访问改函数.   那么为什么要通过指针来访问函数呢?下面通 ...

  3. c语言马拉松试题,C语言马拉松_04.2_函数与指针

    函数与指针 我们知道C语言中最不容易理解同时也是最重要的部分就是指针,指针可以说贯穿了整个C语言,C程序中所有的对象都可以通过指针的方式进行访问,所以熟练的使用指针是学好C语言的必备条件. 函数 函数 ...

  4. C语言(二)- 函数、指针、数组

    一.函数 1.输入函数.输出函数 2.常用函数 3.定义函数.调用函数 二.指针 1.指针 2.指针之数组 3.指针之字符串 4.指针之函数 三.数组 1.一维数组 2.二维数组 转载于:https: ...

  5. 关于调用子函数给主函数指针分配内存

    典型的错误例子如下 在这个主函数的指针给子函数传递一个指针,而在子函数中形参有开辟了一块内存,此子函数的指针的内存里存储的地址与主函数是同一地址, 即主函数的指 针和子函数形参的指针都指向同一块内存的 ...

  6. C语言如何实现返回子函数的多个参数

    C语言如何返回子函数的多个参数 1 第一种方法 2 第二种方法(采用结构体) 1 第一种方法 // 如何某个子函数待返回的两个参数 #include<stdio.h>// 某个子函数待返回 ...

  7. 怎样设置一个函数C语言,C语言中怎样编写一个函数 如何在C语言中定义一个函数?...

    如何在C语言中定义一个函数?小编很想在你面前流泪最后却还是选择装作打个哈欠 为什么小编怎么定义函数都不正确呢? 总是说小编 表达语法错误在main函数中 小编们可以在头文件与main函数之间定义,并编 ...

  8. python调用子函数时参数传递问题

    场景: python建立子函数,在主程序中进行调用. 问题描述 将全局变量传入子函数,子函数中对局部变量进行修改导致全局变量发生. 示例代码: import numpy as np def softm ...

  9. 主函数和子函数的传值传址例子

    #include<string.h> #include<stdlib.h> #include<stdio.h> typedef unsigned char Uint ...

最新文章

  1. python库缺少pkg_resource_ImportError: No module named pkg_resources解决方案
  2. 统计计量 | 协方差和相关系数的暧昧关系:共性与个性
  3. (原创分享,改进版)CSS样式表速成!
  4. mysql常见报错解决办法
  5. 【MOSS】快速调试Sharepoint站点
  6. 机器学习算法--协同过滤算法
  7. 根据url提取网站域名的方法小结
  8. SQL SERVER中关于OR会导致索引扫描或全表扫描的浅析
  9. php 页面拖动改变大小,鼠标拖动改变DIV等网页元素的大小的实现方法
  10. PyQt5将ui文件编译为py文件的方法
  11. 基于嵌入式linux的流媒体传输系统
  12. 费氏数列(c/python)
  13. 知识图谱(以金融知识图谱为例)
  14. 如何选择合适焦距工业相机镜头
  15. 【边学边记_10】——8 位7段数码管的动态显示
  16. 腾讯2016实习招聘-安全岗笔试题答案详细解释
  17. 厉害了,又一个资源神器
  18. STACEY矩阵-0114
  19. 2010提升你幽默感的语句
  20. 用matlab画出ex,如何用matlab画函数图形

热门文章

  1. SSM框架整合之中出现的一些问题及解决方法
  2. php正则表达式 或与,PHP和正则表达式
  3. 铂金03:一劳永逸-如何理解锁的可重入问题
  4. mooc北大软件工程课后习题答案与解析-第三周:结构化分析方法
  5. nginx 重启命令
  6. 计算机科学期刊发票,发票信息查询系统的设计与实现 计算机科学与技术(毕业论文).doc...
  7. 销售人员如何赞美才能把握好这个度?
  8. BMC助力四川农信社实现数字化转型
  9. Leetcode 1118:一月有多少天(超详细的解法!!!)
  10. linux系统suid提权