(C++)函数参数传递中的一级指针和二级指针
主要内容:
1、一级指针和二级指针
2、函数指针传递的例子
3、什么时候需要传递二级指针?
4、二级指针在链表中的使用
1、一级指针和二级指针
一级指针:即我们一般说的指针,就是内存地址;
二级指针:指向指针的指针,就是地址的地址;
如:
int a=1;
int *p=&a; // p为a变量的地址,通过*p可以得到a的值
int **q=&p; // q为p指针的地址,通过**q可以得到a的值
2、函数指针传递的例子
程序1:
#include<stdio.h>
void fun(int *p){
int b=100;
p=&b;
}
int main(){
int a=10;
int *q;
q=&a;
printf("%d\n",*q);
fun(q);
printf("%d\n",*q);
return 0;
}
运行结果:
10
10
程序2:
#include<stdio.h>
void fun(int **p){
int b=100;
*p=&b;
}
int main(){
int a=10;
int *q;
q=&a;
printf("%d\n",*q);
fun(&q);
printf("%d\n",*q);
return 0;
}
运行结果:
10
100
程序3:
#include<stdio.h>
#include<stdlib.h> void myMalloc(char *s){
s=(char*)malloc(100);
} int main()
{
char *p=NULL;
myMalloc(p);
if(p==NULL)
printf("P is not changed!\n");
else{
printf("P has been changed!\n");
free(p);
}
return 0;
}
运行结果:
P is not changed!
程序4:
#include<stdio.h>
#include<stdlib.h> void myMalloc(char **s){
*s=(char*)malloc(100);
} int main()
{
char *p=NULL;
myMalloc(&p);
if(p==NULL)
printf("P is not changed!\n");
else{
printf("P has been changed!\n");
free(p);
}
return 0;
}
运行结果:
P has been changed!
3、什么时候需要传递二级指针?
通过上述例子,我们可以看到,在某些情况下,函数参数传递一级指针时,在函数体内对指针做变动,也不会对原始指针产生变化,而传递二级指针时,则可以,这是为什么呢?
在传递一级指针时,只有对指针所指向的内存变量做操作才是有效的;
在传递二级指针时,只有对指针的指向做改变才是有效的;
下面做简单的分析:
在函数传递参数时,编译器总会为每个函数参数制作一个副本,即拷贝;
例如:
void fun(int *p),指针参数p的副本为_p,编译器使_p=p,_p和p指向相同的内存空间,如果在函数内修改了_p所指向的内容,就会导致p的内容也做相应的改变;
但如果在函数内_p申请了新的内存空间或者指向其他内存空间,则_p指向了新的内存空间,而p依旧指向原来的内存空间,因此函数返回后p还是原来的p。
这样的话,不但没有实现功能,反而每次都申请新的内存空间,而又得不到释放,因为没有将该内存空间的地址传递出来,容易造成内存泄露。
void fun(int **p),如果函数参数是指针的地址,则可以通过该参数p将新分配或新指向的内存地址传递出来,这样就实现了有效的指针操作。
如果觉得二级指针比较难理解,也可以通过函数返回值的形式来传递动态内存(切记不能返回栈内存),如:
#include<stdio.h>
#include<stdlib.h> char* myMalloc(){
char *s=(char*)malloc(100);
return s;
} int main()
{
char *p=NULL;
p=myMalloc();
if(p==NULL)
printf("P is not changed!\n");
else{
printf("P has been changed\n");
free(p);
}
return 0;
}
知道了上述这些,就不难理解上面四个小程序的执行结果了。
4、二级指针在链表中的使用
在链表或者树的操作中,也需要用到二级指针,
比如创建链表的头指针:
在初始化链表函数中,传入头指针,并在函数中为该指针分配空间,此时就应该使用二级指针,如void initLinklist(Node **head);
而在添加删除结点的过程中,我们并没有改变函数参数指针的指向,而是通过传入的指针如Node *head,找到要删除结点的位置,并未对该指针做改变,因此退出函数后,该指针无影响。
(C++)函数参数传递中的一级指针和二级指针的更多相关文章
- C语言一级指针与二级指针
指针的概念 指针就是地址, 利用这个地址可以找到指定的数据 指针就是地址, 那么在使用的时候, 常常会简单的说 指针变量为指针 指针变量就是存储地址的变量 int *p1;// 申请了一个变量, 即在 ...
- Hibernate中的一级缓存、二级缓存和懒加载(转)
1.为什么使用缓存 hibernate使用缓存减少对数据库的访问次数,从而提升hibernate的执行效率.hibernate中有两种类型的缓存:一级缓存和二级缓存. 2.一级缓存 Hibenate中 ...
- Hibernate中的一级缓存、二级缓存和懒加载
1.为什么使用缓存 hibernate使用缓存减少对数据库的访问次数,从而提升hibernate的执行效率.hibernate中有两种类型的缓存:一级缓存和二级缓存. 2.一级缓存 Hibenate中 ...
- C指针--通过二级指针往回拉数据
现在有这种需求,在main函数中建立一个二叉树的root结点的指针,在tree_create函数中malloc或者new一个二叉树结点,然后在main函数中能正常的访问这个新建的结点. 注:这里的tr ...
- 深入理解MyBatis中的一级缓存与二级缓存
http://blog.csdn.net/weixin_36380516/article/details/73194758 先说缓存,合理使用缓存是优化中最常见的,将从数据库中查询出来的数据放入缓 ...
- [hosts]在hosts中屏蔽一级域名和二级域名的写法
一级域名,如baidu: 0.0.0.0 baidu.com 二级域名 如有道公开课 0.0.0.0 ke.youdao.com 不带协议名,不带www. 用127.0.0.1也可以.
- c++指向指针的指针与 c++指针作为函数参数传递问题
一直搞不明白,c++中指针到底是个啥东西,今天遇到到c++,指向指针的指针的问题,突然有点开窍了. 举个例子: int main(int argc, char** argv){ int a[5]={1 ...
- OpenCV二维Mat数组(二级指针)在CUDA中的使用
CUDA用于并行计算非常方便,但是GPU与CPU之间的交互,比如传递参数等相对麻烦一些.在写CUDA核函数的时候形参往往会有很多个,动辄达到10-20个,如果能够在CPU中提前把数据组织好,比如使用二 ...
- 对线程等待函数pthread_join二级指针参数分析
分析之前先搞明白,这个二级指针其实在函数内部是承接了上个线程的返回值. 看man手册,发现返回值是个普通指针.人家用二级指针来承接,可能准备干大事.这个可以自己搜索一下.原因嘛,二级指针是保存了这个地 ...
随机推荐
- codevs 1102 采药 2005年NOIP全国联赛普及组
1102 采药 2005年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB gold 题目描述 Description 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最 ...
- BZOJ2754 [SCOI2012]喵星球上的点名 SA+莫队+树状数组
题面 戳这里 题解 首先先把所有给出的姓名和询问全部接在一起,建出\(height\)数组. 某个串要包含整个询问串,其实就相当于某个串与询问串的\(lcp\)为询问串的长度. 而两个后缀\(Suff ...
- Nginx 常见问题与错误处理
常见问题与错误处理1. 400 bad request 错误的原因和解决办法配置 nginx.conf 相关设置如下.client_header_buffer_size 16k;large_clien ...
- ms08-067漏洞的复现
MS08-067漏洞重现 (1):MS08-067远程溢出漏洞描述 MS08-067漏洞的全称为“Windows Server服务RPC请求缓冲区溢出漏洞”,如果用户在受影响的系统上收到特制的 RPC ...
- WordPress插件会员简化1.58 -任意文件下载漏洞(附poc)
今天我们将讨论在WordPress插件WordPress插件与重点会员简化v1.58作为这个剧本的创作时间不打补丁的扶贫开发实践.脆弱脚本如下: CVE-ID:cve-2017-1002008 当然, ...
- windows下eclipse搭建android_ndk开发环境
安装cygwin: 由于NDK编译代码时必须要用到make和gcc,所以你必须先搭建一个linux环境, cygwin是一个在windows平台上运行的unix模拟环境,它对于学习unix/linux ...
- 微信小程序缓存滑动距离,当页面浏览到一定位置,滑动其他页面后返回该页面记录之前的滑动距离
15.微信小程序缓存滑动距离 我们在浏览页面的时候,然后左滑或者右滑到新的页面,等返回此页面,我们希望可以记录上次滑动的距离 虽然这个实现起来并不难,但是会遇到一些坑,因为scroll-view的组件 ...
- Powerdesigner打开工程提示打印错误 解决方法
在使用PowerDesigner打开工程时, 提示打印错误的问题,具体错误信息提示如下: 在您可以执行与打印机有关的任务(例如页面设置或打印一个文档)之前,您必须已经安装打印机.您想现在安装打印机么? ...
- How to open a web site with the default web browser in a NEW window
http://delphi.about.com/cs/adptips2004/a/bltip0504_4.htm When using ShellExecute (as explained in th ...
- HF Reader