winktv冬天百度云的ZZ,谢谢

指针和引用?_c++吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:277,463贴子:
指针和引用?收藏
谁给我讲一下传指针和传引用的区别呀?我怎么看书上看不懂呢?
山西磐控是专注于提供孤网产品和微型电网解决方案的专业化公司.
引用更安全。
回复:2楼您能不能详细点说明一下?谢谢谢谢。。。
编译后好像没区别
回复:3楼我的理解是,不容易出错。其他都一样
回复:5楼哦了。。。你说的我可不可以理解为:传引用是直接将地址传过去,避免传递地址指针时出现错误(即使是非常微小概率的指针指向错误)?
引用就是直接传变量地址。指针就是用来保存变量地址的一个变量。。我一直是这样理解的说- -
不对,比如char*p=&a;你可以令*++p=100;而引用就不行
我的理解是.引用是对象的一个别名
回复:8楼I got it.我有自己的理解了,用指针指向变量的地址,然后将该指针传递给目标对象,是传指针。引用就是将变量地址直接传过去。谢谢各位好心人。
一家助力企业节省30%差旅费用的公司,是怎么做到的?
回复:8楼声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。所以自然是不行的吧。。指针就可以因为他就是用来保存地址的。
比如int a=123; int* b=&a; 这个时候b指向0x003bf8ec *++b=100;这个时候b指向0x003bf8f0。系统开辟了一个新的空间值为100.但是把b指向0x003bf8ec那么值还是123。所以应该能吧。。或许我没理解你的意思?
引用就是指针重载了一些操作。引用不一定不分配内存,指针也不一定要分配内存
z2665:我那贴回复的是楼主六楼的问题
13楼:求详细解释
有不给引用分配内存的编译器?求解
啊,指针...
-15:字面意思
不分配是说被优化掉,一般教材指针的第一个例子都符合
但如果插一条cout,那么会强制分配空间,感觉有点像测不准原理
指针更灵活,引用更安全编译器优化了都差不多
回复:14楼手机什么的最讨厌了- -。。。害得我打了这么多字。。啊啊啊。。。求补偿- -
回复:24楼么么
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或博客访问: 829060
博文数量: 299
博客积分: 3251
博客等级: 中校
技术积分: 2986
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
原文地址: 作者:
要理解值传递、指针传递和引用传递的区别,主要要理解函数的实参和形参,函数的作用域(自动变量、栈),内存的布局以及指针和引用的特点。这里主要总结三种参数传递方式使用的主要场合。
值传递:只给函数提供输入值,需要复制开销,大对象很少使用值传递。
指针传递:可以改变指针指向内容的值,但是不能改变指针本身,无需复制开销。如果需要改变指针本身,可以使用二重指针或者指针引用。
引用传递:除了提供输入值外,还返回操作结果,无需复制开销。
#include<stdlib.h>
//值传递,函数体内变量n是参数n的一份拷贝,函数体内改变n的值不会改变外面的n
void&addTenByVal(int&n)
&&&&n&=&n&+&10;
&&&&return;
//指针传递,n是指向外部变量的指针,改变*n的值,也会改变外面变量的
void&addTenByPtr(int&*n)
&&&&*n&=&*n&+&10;
&&&&return;
//引用传递,别名引用,牵一发而动全身
void&addTenByRef(int&&n)
&&&&n&=&n&+&10;
&&&&return;
int&main(int&argc&,&char&*argv[])
&&&&int&n&=&10;
&&&&printf("值传递前,n=%d\n",n);
&&&&//值传递
&&&&addTenByVal(n);
&&&&printf("值传递后,n=%d\n",n);
&&&&printf("指针传递前,n=%d\n",n);
&&&&//指针传递
&&&&addTenByPtr(&n);
&&&&printf("指针传递后,n=%d\n",n);
&&&&printf("引用传递前,n=%d\n",n);
&&&&//引用传递
&&&&addTenByRef(n);
&&&&printf("引用传递后,n=%d\n",n);
&&&&system("pause");
&&&&return&0;
后来复习的时候又写了一个DEMO,这个不需要解释,大家都懂的。
&#include&<stdio.h>
#include&<tchar.h>
#include&<cstdlib>
#include&<iostream>
#include&<sys/timeb.h>
#include&<ctime>
#include&<climits>
using&namespace&
//交换参数-值传递
void&SwapByVal(int&v1,int&v2)
&&&&int&tmp&=&v2;
&&&&v2&=&v1;
//交换参数-引用传递
void&SwapByRef(int&&v1,int&&v2)
&&&&int&tmp&=&v2;
&&&&v2&=&v1;
//交换参数-指针传递
void&SwapByPtr(int&*v1,int&*v2)
&&&&int&tmp&=&*v2;
&&&&*v2&=&*v1;
&&&&*v1&=&
int&_tmain(int&argc,&_TCHAR*&argv[])
&&&&//值传递
&&&&int&a&=&10&,&b&=&20;
&&&&cout&<<&"值传递前:a&=&"&<<&a&<<&"&;&b&=&"&<<&b&<<&
&&&&SwapByVal(a,b);
&&&&cout&<<&"值传递后:a&=&"&<<&a&<<&"&;&b&=&"&<<&b&<<&
&&&&//复位-引用传递
&&&&a&=&10&,&b&=&20;
&&&&cout&<<&"引用传递前:a&=&"&<<&a&<<&"&;&b&=&"&<<&b&<<&
&&&&SwapByRef(a,b);
&&&&cout&<<&"引用传递后:a&=&"&<<&a&<<&"&;&b&=&"&<<&b&<<&
&&&&//复位-指针传递
&&&&a&=&10&,&b&=&20;
&&&&cout&<<&"指针传递前:a&=&"&<<&a&<<&"&;&b&=&"&<<&b&<<&
&&&&SwapByPtr(&a,&b);
&&&&cout&<<&"指针传递后:a&=&"&<<&a&<<&"&;&b&=&"&<<&b&<<&
&&&&system("pause");
&&&&return&0;
阅读(3649) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。揭秘C#中引用传递与指针传递区别
●引用不能为空,指针可以为空;
●&sizeof&引用&得到的是所指向的变量(对象)的大小,而&sizeof&指针&得到的是指针本身的大小;
●指针和引用的自增(++)运算意义不一样;
●引用是类型安全的,而指针不是&(引用比指针多了类型检查
一、引用的概念
引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。
例如: Point pt1(10,10);
Point &pt2=pt1; 定义了pt2为pt1的引用。通过这样的定义,pt1和pt2表示同一对象。
需要特别强调的是引用并不产生对象的副本,仅仅是对象的同义词。因此,当下面的语句执行后:
pt1.offset(2,2);
pt1和pt2都具有(12,12)的值。
引用必须在定义时马上被初始化,因为它必须是某个东西的同义词。你不能先定义一个引用后才
初始化它。例如下面语句是非法的:
Point &pt3;
那么既然引用只是某个东西的同义词,它有什么用途呢?
下面讨论引用的两个主要用途:作为函数参数以及从函数中返回左值。
二、引用参数
1、传递可变参数
传统的c中,函数在调用时参数是通过值来传递的,这就是说函数的参数不具备返回值的能力。
所以在传统的c中,如果需要函数的参数具有返回值的能力,往往是通过指针来实现的。比如,实现
两整数变量值交换的c程序如下:
void swapint(int
*b){int temp;temp=*a;a=*b;*b=temp;}&使用引用机制后,以上程序的c++版本为:void swapint(int
&b){int temp;temp=a;a=b;b=temp;}
调用该函数的c++方法为:swapint(x,y); c++自动把x,y的地址作为参数传递给swapint函数。
2、给函数传递大型对象
当大型对象被传递给函数时,使用引用参数可使参数传递效率得到提高,因为引用并不产生对象的
副本,也就是参数传递时,对象无须复制。下面的例子定义了一个有限整数集合的类:
const maxCard=100;Class
Set{int elems[maxCard];
// 集和中的元素,maxCard 表示集合中元素个数的最大值。int card;
// 集合中元素的个数。public:Set
//构造函数friend Set
//重载运算符号*,用于计算集合的交集 用对象作为传值参数// friend Set operator * (Set & ,Set & ) 重载运算符号*,用于计算集合的交集 用对象的引用作为传值参数...}
先考虑集合交集的实现
Set2){Set res;for(int i=0;i&Set1.card;++i)for(int j=0;j&Set2.card;++j)if(Set1.elems[i]==Set2.elems[j]){res.elems[res.card++]=Set1.elems[i];break;}return res;}
由于重载运算符不能对指针单独操作,我们必须把运算数声明为 Set 类型而不是 Set * 。
每次使用*做交集运算时,整个集合都被复制,这样效率很低。我们可以用引用来避免这种情况。
Set res;for(int i=0;i&Set1.card;++i)for(int j=0;j&Set2.card;++j)if(Set1.elems[i]==Set2.elems[j]){res.elems[res.card++]=Set1.elems[i];break;}return res;}
三、引用返回值
如果一个函数返回了引用,那么该函数的调用也可以被赋值。这里有一函数,它拥有两个引用参数并返回一个双精度数的引用:
&max(double
&d1,double
&d2){return d1&d2?d1:d2;}
由于max()函数返回一个对双精度数的引用,那么我们就可以用max() 来对其中较大的双精度数加1:
max(x,y)+=1.0;
【声明】:黑吧安全网()登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱,我们会在最短的时间内进行处理。
上一篇:【】【】C/C++基础(44)
C++写了很多年,有一天,写着写着代码。竟然自己发现对传值,传指针,传引用这个每天都在用的传递方式的区别还不是很清楚。以为自己懂了,其实还理解得还不够深入,基础还需要花时间琢磨。今天参考了很多篇博客和书籍做些总结。
其实,不用分为三类,只有两类即可。传值和传引用。为什么会出现传地址(即传指针)呢?本质就是大家一致对传值和传地址概念的理解错误导致,也是对指针的概念的理解错误导致。
指针:指针就是一个变量,如果非要说是一个特殊的变量也不为过,因为指针的初始化和解引用等不同的操作方式而已。就内存的分布来说,指针和一个变量在内存中存放是没有任何区别的,无非指针存放的是变量的地址。
传值:传值无非就是实参拷贝传递给形参,单向传递(实参-&形参),赋值完毕后实参就和形参没有任何联系,对形参的修改就不会影响到实参。
传地址:为什么说传地址也是一种传值呢?因为传地址是把实参地址的拷贝传递给形参。还是一句话,传地址就是把实参的地址复制给形参。复制完毕后实参的地址和形参的地址没有任何联系,对实参形参地址的修改不会影响到实参, 但是对形参地址所指向对象的修改却直接反应在实参中,因为形参指向的对象就是形参的对象。
传引用:传引用本质没有任何实参的拷贝,一句话,就是让另外一个变量也执行该实参。就是两个变量指向同一个对象。这是对形参的修改,必然反映到实参上。
#include&iostream&
using namespace std;
void Value(int n)
cout && "Value(int n)"&&
cout && "{" &&
&n=" && &n &&
cout && "}" &&
void Reference(int &n)
cout && "Reference(int &n)" &&
cout && "{" &&
n=" && n && "
&n=" && &n &&
cout && "}" &&
void Pointer(int *n)
cout && "Pointer(int *n)" &&
cout && "{" &&
n=" && n && "
&n=" && &n &&
int b = 20;
b=" && b && "
n = &b" &&
n=" && n && "
&n=" && &n &&
cout && "}" &&
int main()
int n = 10;
cout && "n = " && 10 && "
&n=" && &n && endl&&
cout && "after Value() n=" && n && endl &&
Reference(n);
cout && "after Reference() n=" && n && endl &&
Pointer(&n);
cout && "after Pointer() n=" && n && endl &&
system("pause");
return true;
运行结果:
值传递时函数操作的并不是实参本身,形参和实参是相互独立的,所以对形参进行操作并不会改变实参的值。
引用传递操作地址是实参地址 ,形参相当于实参的一个别名,对它的操作就是对实参的操作。
指针传递时,可以通过指针操作实参,同样可以改变实参的值。
传引用和传指针看上去效果一样的,但本质上有区别:
指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。
在值传递过程中,被调函数的形式参数作为被调函数的局部变量,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,前面说过,值传递是单向传递(实参-&形参),赋值完毕后实参就和形参没有任何联系。那指针传递是怎么通过这个局部变量访问实参的呢,当然是通过局部变量中存储的地址。
既然形参和实参是相互独立的,在没有任何修饰形参时,形参是可以被修改的,形参指针可以指向任何地方,而且修改后就无法再访问到实参。例如Pointer函数中n = &b后,(*n)++不会再修改实参的值,这也是传递指针时通常会用const进行修饰的原因。
而在引用传递过程中,被调函数的形式参数虽然同样作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
引用传递和指针传递是不同的,虽然它们都是在被调函数栈空间上的一个局部变量,但是任何对于引用参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变量。而对于指针传递的参数,如果改变被调函数中的指针地址,它将影响不到主调函数的相关变量。
为了进一步加深大家对指针和引用的区别,下面我从编译的角度来阐述它们之间的区别:
程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表生成后就不会再改,因此指针可以改变其指向的对象(指针变量中的值可以改),而引用对象则不能修改。
最后,总结一下指针和引用的相同点和不同点:
★相同点:
●都是地址的概念;
指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。
★不同点:
●指针是一个实体,而引用仅是个别名;
●引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;
●引用没有const,指针有const,const的指针不可变;(具体指没有int& const a这种形式,而const int& a是有
前者指引用本身即别名不可以改变,这是当然的,所以不需要这种形式,后者指引用所指的值不可以改变)
●引用不能为空,指针可以为空;
●“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;
●指针和引用的自增(++)运算意义不一样;
●引用是类型安全的,而指针不是 (引用比指针多了类型检查)
以上内容是网上和书籍上找到的资料结合自己的理解写的,有不对的地方,欢迎指教,一同学习。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:43835次
积分:1288
积分:1288
排名:千里之外
原创:85篇
转载:55篇
(10)(18)(16)(3)(1)(23)(2)(2)(2)(10)(4)(1)(15)(18)(9)}

我要回帖

更多关于 winktv冬天 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信