C/C++什么时候使用二级指针,你知道吗?
时间:2022-07-28
本文章向大家介绍C/C++什么时候使用二级指针,你知道吗?,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一.前言
先来看一段代码:
int * p = NULL;
void func(int *p)
{
int * p_y = new int[10];
p = p_y;
}
大家认为这段代码是否能达到预期效果?留个坑,最后说。
以前就遇到函数参数是指针,想要修改指针,结果总是不理想,前几天群里也是有萌新问到这个问题,刚好我当时在书上看到怎么一句话:函数参数是按值传递和按引用传递,瞬间就顿悟了这个问题。
指针作形参,需要注意的问题 这是以前发现问题时写的,只写了解决方法,并没有说明其中原因,其实是当时还是不知原因的,俗话说:知其然,知其所以然,刚好顿悟了这个原因,就记录一下下吧,文章想到最后,感觉做一个图比较有意思,第一次作图,只是想尽力表达,嘿嘿。从小语文就不好,勿怪。
什么时候使用二级指针,这个是针对按值传递来说的,所以按引用传递,我们不说。想要理解什么时候使用二级指针,就要理解按值传递,按值传递是理解何时使用何种指针做参数的精髓。
二.正文
1. int类型做函数参数
void func_1(int a)
{
a = 10;
}
int a = 1;
func_1(a);
cout<< a ;
a会输出什么?这是一个老生常谈的问题了,学习函数参数的时候,交换两个数是必学的案例,答案就是传入指针才能修改,为什么呢?想要知道答案要了解函数在内部做了什么:
第一,函数自己创建了一个临时变量。
第二,将函数传进来的值赋值给临时变量,所以我们修改函数里所谓的a只是一个临时变量,并不是修改的函数外的a。
void func_1(int a)
{
a = 10;
//临时变量a的值从1被修改为10,这都与外部变量a没有任何关系,这便是按值传递。
}
接下来,来看一级指针做参数
2.一级指针做参数
void func_2(int * a)
{
*a = 10;
//函数接受一个值,这个值是地址,谁的地址?外部变量a的地址,同样的套路,函数创建一个临时变量(指针类型)来存储外部变量a的地址
//在函数内部使用临时变量a可得到外部变量a的地址,使用*a可以获取外部变量a地址中所存储的值。
//这个临时变量a复制的是外部变量的地址,按值传递,无论怎么复制,地址是唯一的,通过地址来修改外部变量的值是可以实现的。
}
int a = 1;
func_2(&a);
重点来了
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的地址
//所以该函数实现不了预期的功能
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);
4. 总结
代码所述,总结下来就两句话:
1.如果想要修改指针指向变量的值,则无需传入高一级的指针,使用同级指针即可。
2.如果想要修改指针本身的值,也就是地址,则应使用比原指针高一级的指针来实现。
3.图片所述,除了想要表达文章意思之外,也表达出了某种规则,需要我们自身强大呀。
4.所以文章开头的代码无法实现预期效果,因为它想修改自身。
- 《JavaScript高级程序设计》学习笔记(5)——面向对象编程
- 《JavaScript高级程序设计》学习笔记(4)——引用类型
- iOS项目——基本框架搭建
- iOS学习——键盘弹出遮挡输入框问题解决方案
- iOS项目——项目开发环境搭建
- im协议设计选型(上)
- iOS学习——UIAlertController详解
- iOS学习——获取iOS设备的各种信息
- iOS学习——属性引用self.xx与_xx的区别
- iOS学习——iOS 整体框架及类继承框架图
- iOS学习—— UINavigationController的返回按钮与侧滑返回手势的研究
- iOS学习——iOS常用的存储方式
- iOS学习——内存泄漏检查及原因分析
- IOS学习——iphone X的适配
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 单性状动物模型矩阵形式计算BLUP值
- 如何计算一般配合力和特殊配合力
- 【29期】Java集合框架 10 连问,你有被问过吗?
- 学徒数据挖掘之谁说生存分析一定要按照表达量中位值或者平均值分组呢?
- 软件质量的黄金准则
- 你应该了解的5种TypeScript设计模式
- Vue.js 教程:构建一个特斯拉汽车余电计算器
- 文件系统:隐匿在 Linux 背后的机制
- MySQL在Docker环境下运行基础
- Redis 秒杀实战
- Oracle 19c集群重装步骤详解
- 神经网络训练中回调函数的实用教程
- DGA域名检测的数据分析与深度学习分类
- Saferwall:下一代开源恶意软件分析平台
- Java安全编码之SQL注入