C++指针传递和引用传递的区别 (转载整理)
区别1:指针传递和引用传递是以不同的方式实现相同的效果,但是指针传递的本质还是值传递,只是传递的值是地址。
就拿 交换两个数的函数来举例:
// 指针传递
void swap(int * val1, int * val2)
{
int temp;
temp = *val1;
*val1 = *val2;
*val2 = temp;
} // 引用传递
void swap_numbers(int & val1,int & val2)
{
int temp;
temp = val1;
val1 = val2;
val2 = temp;
}
调用上面两个函数都可以实现 val1 和 val2 的值的交换。
int first = , second = ; swap_numbers(first,second); // 传递引用,也就是别名 int a,b; swap(&a,&b); // 传递指针,也就是地址
但是,归根到底,指针是储存了值的地址的值,也还是实现了值传递。
而引用传递,传入的是变量名称,相当于在交换函数内部使用了外部变量的别名,操作的依然是变量本身。
区别2:指针传递相对于引用传递更灵活,也就更不受约束。
如果把引用传递类比为指针传递开辟了新的变量存储了别名的相关信息的话,那么,指针传递的地址的值是可变的,同时,该地址空间中存储的值也是可变的;而引用传递却是和别名是捆绑,不可再指向其他的地址空间的。
引用本质上就是一个 const 指针,但是两者有一定的差别,不能互换使用。
总之,引用传递作为 C++ 区别于 C 语言的一种特性,使得传参更为灵活,方便,还避免了指针使用易出错的情况。
详细的引用传递和指针传递的引用可以 参考博客:
C++中引用传递与指针传递区别(进一步整理) - - ITeye博客
C++指针传递和引用传递的区别 (转载整理)的更多相关文章
- c++值传递,指针传递,引用传递以及指针与引用的区别
值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入, 不能传出.当函数内部需要修改参数,并且不希望这个改变影 ...
- Java中引用类型变量,对象,值类型,值传递,引用传递 区别与定义
一.Java中什么叫做引用类型变量?引用:就是按内存地址查询 比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里new了一个Stri ...
- 【转载】C++ 值传递、指针传递、引用传递详解
原文链接:http://www.cnblogs.com/yanlingyin/ 值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形 ...
- java基本数据类型传递与引用传递区别
文章转载自 zejian的博客http://blog.csdn.net/javazejian/article/details/51192130 java的值传递和引用传递在面试中一般都会都被涉及到, ...
- C++ 值传递、指针传递、引用传递详解
C++ 值传递.指针传递.引用传递详解 最近写了几篇深层次讨论数组和指针的文章,其中提到了“C语言中,所有非数组的形式参数传递均以值传递形式” 数组和指针背后——内存角度 语义"陷阱&quo ...
- 【转】C++ 值传递、指针传递、引用传递详解
而关于值传递,指针传递,引用传递这几个方面还会存在误区, 所有我觉的有必要在这里也说明一下~ 下文会通过例子详细说明哦 值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角 ...
- PHP值传递和引用传递的区别
PHP值传递和引用传递的区别.什么时候传值什么时候传引用 (1)按值传递:函数范围内对值的任何改变在函数外部都会被忽略 (2)按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改 (3)优 ...
- C++中值传递、指针传递、引用传递的总结
C++中值传递.指针传递.引用传递的总结 指针传递和引用传递一般适用于:函数内部修改参数并且希望改动影响调用者.对比值传递,指针/引用传递可以将改变由形参"传给"实参(实际上就 ...
- Android For JNI(三)——C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值
Android For JNI(三)--C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值 C中比较难的这一块,大概就是指针了,所以大家还是多翻阅一下资料,当然,如果只是想了解一下,看本篇 ...
随机推荐
- spark源码阅读之network(3)
TransportContext用来创建TransportServer和TransportclientFactory,同时使用TransportChannelHandler用来配置channel的pi ...
- input 框提示信息
给input添加提示信息,只需添加 “placeholder”的class,将提示信息放在value中, 其中“placeholder”的名字是随便取的,不是H5的“placeholder”属性 例子 ...
- js实现选项卡切换
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- CentOS7下源码包方式安装rabbitmq
1.先安装erlang http://www.cnblogs.com/justphp/p/6093880.html 2.下载rabbitmq rpm包: wget http://www.rabbitm ...
- 现代C++学习笔记之二入门篇2,数据转换
static_cast: 这种强制转换只会在编译时检查. 如果编译器检测到您尝试强制转换完全不兼容的类型,则static_cast会返回错误. 您还可以使用它在基类指针和派生类指针之间强制转换, ...
- PAT 1017 Queueing at Bank (25) (坑题)
Suppose a bank has K windows open for service. There is a yellow line in front of the windows which ...
- unity 大游戏使用什么框架
关于Unity的架构有如下几种常用的方式.1.EmptyGO在Hierarchy上创建一个空的GameObject,然后挂上所有与GameObject无关的逻辑控制的脚本.使用GameObject.F ...
- Android Tablayout属性介绍
1.添加依赖 compile 'com.android.support:design:26.0.0-alpha1' 2.属性 改变选中字体的颜色app:tabSelectedTextColor=&qu ...
- GitHub团队协作流程
说来惭愧,这么长时间,第一次参与修改开源项目,所以整理了一份GitHub团队协作流程,作为备忘,文章大部分内容参考https://www.cnblogs.com/schaepher/p/4933873 ...
- .NET MVC对接POLYV——HTML5播放器播放加密视频
官方参考文档:http://dev.polyv.net/2017/videoproduct/v-playerapi/html5player/html5-docs/ 1.上传视频之前根据自己需要对所上传 ...