C/C++什么时候使用二级指针,你知道吗?

举报
花狗Fdog 发表于 2021/04/19 22:45:37 2021/04/19
【摘要】 2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票! 我的投票地址: 文章目录 一.前言二.正文1. int类型做函数参数2.一级指针做参数3. 二级指针做参数4. 总结 一.前言 先来看一段代码: int * p = NULL; void func(int *p) { int * p_y = new int[10]; p = p_...

2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票!
我的投票地址:


一.前言

先来看一段代码:

int * p = NULL;
void func(int *p)
{ int * p_y = new int[10]; p = p_y;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

大家认为这段代码是否能达到预期效果?留个坑,最后说。


以前就遇到函数参数是指针,想要修改指针,结果总是不理想,前几天群里也是有萌新问到这个问题,刚好我当时在书上看到怎么一句话:函数参数是按值传递和按引用传递,瞬间就顿悟了这个问题。

指针作形参,需要注意的问题
这是以前发现问题时写的,只写了解决方法,并没有说明其中原因,其实是当时还是不知原因的,俗话说:知其然,知其所以然,刚好顿悟了这个原因,就记录一下下吧,文章想到最后,感觉做一个图比较有意思,第一次作图,只是想尽力表达,嘿嘿。从小语文就不好,勿怪。
在这里插入图片描述


什么时候使用二级指针,这个是针对按值传递来说的,所以按引用传递,我们不说。想要理解什么时候使用二级指针,就要理解按值传递,按值传递是理解何时使用何种指针做参数的精髓。

二.正文

1. int类型做函数参数

void func_1(int a)
{ a = 10;
}
int a = 1;
func_1(a);
cout<< a ;

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

a会输出什么?这是一个老生常谈的问题了,学习函数参数的时候,交换两个数是必学的案例,答案就是传入指针才能修改,为什么呢?想要知道答案要了解函数在内部做了什么:

第一,函数自己创建了一个临时变量。
第二,将函数传进来的值赋值给临时变量,所以我们修改函数里所谓的a只是一个临时变量,并不是修改的函数外的a。

在这里插入图片描述

void func_1(int a)
{ a = 10; //临时变量a的值从1被修改为10,这都与外部变量a没有任何关系,这便是按值传递。
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

接下来,来看一级指针做参数

2.一级指针做参数

void func_2(int * a)
{ *a = 10; //函数接受一个值,这个值是地址,谁的地址?外部变量a的地址,同样的套路,函数创建一个临时变量(指针类型)来存储外部变量a的地址 //在函数内部使用临时变量a可得到外部变量a的地址,使用*a可以获取外部变量a地址中所存储的值。 //这个临时变量a复制的是外部变量的地址,按值传递,无论怎么复制,地址是唯一的,通过地址来修改外部变量的值是可以实现的。
}
int a = 1;
func_2(&a);

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

重点来了

void func_2(int * a)
{ a=NULL;//我想让指针指向空
}
int a = 10;
 int *b = &a; //这个b存储的是变量a的地址
 func_2(b);   //如果我要修改b的指向,看似可以修改,其实不可以,注意我说的是指向。
 //老样子,函数创建临时变量a存储b的值,也就是变量a的地址,
 //给变量a赋值为空,结果只是临时变量a被修改了值,而原外部变量b的值还是指向外部变量a的地址
 //所以该函数实现不了预期的功能

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在这里插入图片描述

3. 二级指针做参数

然后一级指针的大哥,二级指针来了说句:你不行,看我操作,于是接手了一级指针。

void func_3(int ** a)
{ **a //函数创建临时变量a来存储c的值,也就是b的地址 //函数内部*a取得外部变量b的地址,**b取得外部变量a的值,修改a,即可成功。
}
int a = 10;
int *b = &a;
int ** c = &b;
func_3(c);

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在这里插入图片描述


4. 总结

代码所述,总结下来就两句话:
1.如果想要修改指针指向变量的值,则无需传入高一级的指针,使用同级指针即可。
2.如果想要修改指针本身的值,也就是地址,则应使用比原指针高一级的指针来实现。
3.图片所述,除了想要表达文章意思之外,也表达出了某种规则,需要我们自身强大呀。
4.所以文章开头的代码无法实现预期效果,因为它想修改自身。

文章来源: blog.csdn.net,作者:花狗Fdog,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/Fdog_/article/details/105583725

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。