首页 > 双重指针作为函数参数的妙用

双重指针作为函数参数的妙用

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

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

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

#include 
#include 
#include void alloc_mem(int **pp, unsigned int size)
{*pp = (int *)malloc(size);printf("alloc_mem: 0x%x
", *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
",p);my_free((void **)&p);printf("after free, mem: 0x%x
",p);return 0;
}

运行结果:

alloc_mem: 0x654260

mem: 0x654260

after free, mem: 0x0

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

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

#include 
#include 
#include 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

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

0x2521010  0x2521010  0x2521010  0x2521010  0x2521010  

0 10 0 30

    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, 不在此赘述。

更多相关:

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...

  • 因为函数参数是按值传递的,所以要想改变变量,必须传递地址。 二级指针实际上就是指针变量的地址,如果传递二级指针,函数声明必须写**。 (void**)&必须是本质上就是指针变量的地址才可以做这样的转换,并不是说把一个一级指针也可以转换,void**的本质是标识一个二级指针。 &data就是(默认数据类型 **)&data,(void...

  • 文章目录1. 解决问题2. 应用场景3. 实现如下:C++实现C语言实现4. 缺点 1. 解决问题 在工厂方法模式中,我们卖衣服。此时我们为每一种衣服创建不同的工厂,帽子有一个工厂专门创建,裤子有一个工厂专门创建,T恤有一个工厂专门创建。这样的方式保证了代码设计的开闭原则(对扩展开发,对修改关闭),解决了简单工厂模式中暴露的...

  • 转载于:http://blog.csdn.net/u012819339/article/details/50654764   实体作品请参看优酷视频。 若以上链接点击无效请把该链接地址复制到浏览器地址栏 http://v.youku.com/v_show/id_XODYzODczNzQ4.html 说明: 该作品为arvik于2014...

  • - (void)viewDidLoad {[super viewDidLoad];NSLog(@"我在玩手机");NSLog(@"手机没电了");[self chargeMyIphone:^{NSLog(@"出门逛街");}];NSLog(@"我在看电视"); }-(void)chargeMyIphone:(void(^)(void...

  • http://stackoverflow.com/questions/150446/how-do-i-detect-when-someone-shakes-an-iphone 我的实现(基于Eran Talmor): 没必要application.applicationSupportsShakeToEdit = YES; Set th...