双重指针作为函数参数,可以在函数函数内部修改外部指针的值。主要用法包括:
#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
下面的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 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 0
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...