双重指针作为函数参数,可以在函数函数内部修改外部指针的值。主要用法包括:

1. 在函数内部分配内存,作为函数参数返回;

2. 在函数内部设置指针为空;

#include <stdio.h>
#include <stdlib.h>
#include <string.h>void alloc_mem(int **pp, unsigned int size)
{*pp = (int *)malloc(size);printf("alloc_mem: 0x%x\n", *pp);
}void my_free(void **p)
{if (NULL != *p){free(*p);*p = NULL;  /* set pointer as null, avoid wild pointer */}
}
int main()
{   int *p = NULL;alloc_mem(&p, 8);printf("mem: 0x%x\n",p);my_free((void **)&p);printf("after free, mem: 0x%x\n",p);return 0;
}

运行结果:

alloc_mem: 0x654260
mem: 0x654260
after free, mem: 0x0

3.在函数内部修改外部指针的值;

下面的code 在函数内部做了指针++,可以看到setDataCond_1传入了所分配指针的地址,函数内部的(*pp)++修改了外部指针的地址。相反setDataCond却没有修改外部指针的值

#include <stdio.h>
#include <stdlib.h>
#include <string.h>void setDataCond(int *p, unsigned int condi)
{if (condi % 2){*p = condi * 10;}p++;
}void setDataCond_1(int **pp, unsigned int condi)
{if (condi % 2){**pp = condi * 10;}(*pp)++;
}void setDataCond_2(int **pp, unsigned int condi)
{int **cur = pp;if (condi % 2){**cur = condi * 10;}(*cur)++;
}void my_free(void **p)
{if (NULL != *p){free(*p);*p = NULL;}
}int main()
{   unsigned int size = 5;int *p = (int *)malloc(size * sizeof(int));memset((void *)p, 0, size * sizeof(int));    int *t = p;for (int i=0; i<size; i++){setDataCond(t+i, i);//setDataCond_1(&t, i);printf("0x%x  ", t);}printf("\n");for (int i=0; i<size; i++){printf("%d ", *(p+i));}printf("\n");my_free(&p); //free(p);//p = NULL;return 0;
}

调用 setDataCond(t+i, i);运行结果:

0x2521010  0x2521010  0x2521010  0x2521010  0x2521010  
0 10 0 30 0

for (int i=0; i     {
        setDataCond(t+i, i);  //setDataCond并没有修改t的值,依靠t+1完成循环打印。
        //setDataCond_1(&t, i);
        printf("0x%x  ", t);
    }

----------------------------------------------------------------------------

调用 setDataCond_1(&t, i);运行结果

0x18f6014  0x18f6018  0x18f601c  0x18f6020  0x18f6024  
0 10 0 30
    for (int i=0; i     {
        //setDataCond(t+i, i); 
        setDataCond_1(&t, i); //setDataCond_1成功修改t的值
        printf("0x%x  ", t);
    }

----------------------------------------------------------------------------

setDataCond_2 同setDataCond_1, 不在此赘述。

双重指针作为函数参数的妙用相关推荐

  1. C++基础8【难】 回顾:数组指针,函数指针,函数指针做函数参数 C语言多态

    1,数组指针语法梳理 回顾,如何定义数组数据类型: 回顾,如何定义指针类型数组: 回顾,如何直接定义 一个指向数组类型的指针: 2,函数指针语法梳理 1)如何定义一个函数类型 2)如何定义一个函数指针 ...

  2. 【C 语言】指针间接赋值 ( 指针作为 函数参数 的意义 | 间接赋值 代码示例 )

    文章目录 一.指针作为 函数参数 ( 间接赋值 ) 的意义 二.间接赋值 代码示例 一.指针作为 函数参数 ( 间接赋值 ) 的意义 调用函数时 , 调用 & 取地址 生成 实参 p , 将 ...

  3. C++老话题:用指向函数的指针作函数参数

    用指向函数的指针作函数参数 在C语言中,函数指针变量常见的用途之一是作为函数的参数,将函数名传给其他函数的形参.这样就可以在调用一个函数的过程中根据给定的不同实参调用不同的函数. 例如,利用这种方法可 ...

  4. 指针用作函数参数、指针型函数和函数指针

    指针用作函数参数 以前我们学过的函数参数要么是基本数据类型的变量,要么是类的对象,又或者是数组名,前几讲学到的指针同样可以用作函数参数. 指针作函数形参时,我们调用此函数将实参值传递给形参后,实参和形 ...

  5. this指针作为函数参数_C++以指针作为函数参数(学习笔记:第6章 10)

    以指针作为函数参数[1] 为什么需要用指针做参数? 需要数据双向传递时(引用也可以达到此效果) 用指针作为函数的参数,可以使被调函数通过形参指针存取主调函数中实参指针指向的数据,实现数据的双向传递.( ...

  6. C语言中的void和void指针-void*,及void指针做函数参数。

    实例: #include <stdio.h> #include <stdlib.h> void print(void * node) {     printf("%d ...

  7. 【C 语言】结构体 ( 结构体作为函数参数 | 结构体指针作为函数参数 )

    文章目录 一.结构体作为函数参数 二.结构体指针作为函数参数 三.完整代码示例 一.结构体作为函数参数 结构体变量 作为函数形参 , 在函数中 , 只能访问 该函数形参 , 无法修改 结构体内存 的值 ...

  8. 习题 9.5 建立一个对象数组,内放5个学生的数据(学号、成绩),设立一个函数max,用指向对象的指针作函数参数,在max函数中找出5个学生中成绩最高者,并输出其学号。

    C++程序设计(第三版) 谭浩强 习题9.5 个人设计 习题 9.5 建立一个对象数组,内放5个学生的数据(学号.成绩),设立一个函数max,用指向对象的指针作函数参数,在max函数中找出5个学生中成 ...

  9. c语言求三个数最值非函数,C语言编程:从键盘任意输入三个数,编写求其最大值、最小值的函数,用指针作函数参数实现。...

    www.shufadashi.com防采集. C语言编程:从键盘任意输入三个数,编写求其最大值.最小值的函数,用指针作函数参数实现.. #includevoid maxfunction(int*);v ...

最新文章

  1. NLP 预训练家族再思考
  2. 我是怎么保存公众号历史文章合集到本地的?当然是用python了!
  3. 9个用来爬取网络站点的 Python 库
  4. JSON 数据重复 出现$ref
  5. MySQL——通过EXPLAIN分析SQL的执行计划
  6. 重新记录一下微信后台的配置
  7. 不把C作为第一门语言是个好主意么?
  8. 微信小程序四种父子相互传值方式
  9. python笔记记录神器 jupyter notebook
  10. TeeChart.NET 2022.4.8 专业版-Crack
  11. IP 点分十进制表示法
  12. matlab批量将图片反色
  13. 内网穿透服务器搭建教程,NPS使用教程
  14. 进化算法和深度强化学习的关系?
  15. 怎样看股市K线图指标之市场盈亏指标CYS
  16. 处理WIN7任务栏通知区域图标异常问题
  17. 北大计算机学霸,揭秘:2018北大在京录取的学霸们有何特长(组图)
  18. Linux kernel panic问题解决方法
  19. 基于Basys2的分秒计时器的设计
  20. dau、mau、pcu、dnu、wau、acu、uv的意思是什么?怎么分析?

热门文章

  1. 一个较为详细的ETL系统实现方案
  2. php agi api,PHP agi 编写测试
  3. cygwin编译verilator_Windows 安装 verilator
  4. python3 转码的函数_python基础3之文件操作、字符编码解码、函数介绍
  5. linux网络驱动架构,Linux网络体系架构和网卡驱动设计
  6. 服务器主机防御系统,主机入侵防御系统
  7. php 结构体_PHP底层原理知其然知其所以然
  8. java 连接 oracle 10_java 怎么把原本连接32位oracle10g换到连接64位oracle10g
  9. python中 str 和 repr_python repr()与str()区别总结
  10. 卷积神经网络基础:(7)经典的网络架构