指针变量的传值和传址
时间:2022-07-28
本文章向大家介绍指针变量的传值和传址,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
来源:公众号(c语言与cpp编程)
1 引言
举个例子:在func
函数退出后,指针pInt
所指的内容*pInt
为 12
#include <stdio.h>
//公众号:C语言与CPP编程
int func(int* pRes)
{
if(pRes == NULL)
pRes = new int(12);//分配新的内存空间给指针pRes,并赋值
return 0;
}
int main ()
{
int *pInt = NULL;
int val = func(pInt);
printf("%dn",*pInt); return 0;
}
解析:int func(int* pRes)
函数的形参是指针类型 int *pRes
,在函数体中 new
了一块内存并赋值 12,将内存地址赋值给指针 pRes
。在main
函数中,定义了指针pInt
,调用func
函数,把pInt
作为参数传入func
函数中。结果*pInt
并不是 12。
原因:在func
函数调用过程中,形参和实参的传递使用了值传递
方式,这种情况下,形参变量在函数体内
发生了变化,在函数结束之后,形参变量随之释放
,不能把变化的结果返回给实参。
可以使用指针传递
或者引用传递
。想要在函数体内改变pRes
的值,并把这个变化返回到main
函数中,必须传递pRes
的指针。因为pRes
本身就是指针,所以应该传递指针的指针
,或者指针的引用
。
指针的引用
int v = 1;
int *p = &v;'
int *&rp = p;
&
说明r
是一个引用。*
确定r
引用的类型是一个指针。
因为引用不是对象,故无引用的数组,无指向引用的指针,无到引用的引用:
int& a[5]; // 错误
int&* p; // 错误
int& &r; // 错误
所以修改函数int func(int* pRes);
为int func(int *&pRes);
#include <stdio.h>
int func(int* &pRes)
{
if(pRes == NULL)
pRes = new int(12);//分配新的内存空间给指针pRes,并赋值
return 0;
}
int main ()
{
int *pInt = NULL;
int val = func(pInt);
printf("%dn",*pInt);
return 0;
}
2 传值、传引用区别和联系
传值:实参拷贝传递给形参。就是把实参赋值给形参,赋值完毕后实参就和形参没有任何联系,对形参的修改就不会影响到实参。
传地址:把实参地址的拷贝传递给形参。就是把实参的地址复制给形参。复制完毕后实参的地址和形参的地址没有任何联系,对实参形参地址的修改不会影响到实参, 但是对形参地址所指向对象的修改却直接反应在实参中,因为形参指向的对象就是形参的对象
。
传引用:本质没有任何实参的拷贝,两个变量指向同一个对象。这是对形参的修改,必然反映到实参上。
- 无论传值还是传指针,函数都会生成一个临时变量,但传引用时,不会生成临时变量,
- 传值时,只可以引用值而不可以改变值,但传值引用时,可以改变值,
- 传指针时,只可以改变指针所指的内容,不可以改变指针本身,但传指针引用时,既可以改变指针所指的内容,又可以改变指针本身,
- 引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。
参考书籍《C陷阱与缺陷》
- 使用VBA创建Access数据表
- 新时代已经来临,你做好准备了吗?
- Python自学笔记——多线程微信文章爬取
- 习近平要求加快这项技术发展 与你关系很密切!
- 趴比库获数百万元融资 域名pabiku.com给力十足
- 联袂腾讯 “互联网+税务”创新模式在蒙启动
- 学医11年,终将被机器取代
- 大数据揭示:女性比男性更关注医改 建档等是热门话题
- 腾讯人工智能实验室AI Lab主任张潼博士前沿对话:AI如何助力营销?
- 当前所有源码链接
- Python入门基础连载(4)控制流
- 济西站构建大数据运营网络,打造智能化列车加工厂
- 五位数终端收购的域名dongxiao.cn已启用
- 全球互联网发展进入“拐点”——展望下一代互联网
- 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 数组属性和方法
- 性能最佳实践:MongoDB数据建模和内存大小调整
- 节省你生命的一个小技术No.193
- K8S 生态周报| Traefik v2.3.0-rc2 发布
- 如何从 Notion 批量导出 Markdown?
- 【LeetCode】1518. 换酒问题
- OBS推流工具使用说明
- Python多进程
- app反编译遇到360加固,傻瓜式脱壳
- Java底层-本地接口(JNI)
- 如何从最坏、平均、最好的情况分析复杂度?
- 利用Python进行MR栅格数据处理
- 利用Sql处理MR栅格数据
- Netty组件之Channel注册
- 使用 kubeadm 安装单 master kubernetes 集群
- 垃圾回收算法(4)-复制算法