[转载]& 引用 取地址
引用实际上就是给同一个变量取了多个名字。
举个例子:
有个人的名字叫a,之后又改名叫b,这时a和b都是指这个人,这样b就引用了a,即b就是a。
int
&a
=
b;
........1
int
*a
=
&b;
........2
在1的情况下,
只分配了b的空间
在2的情况下,
分配了a和b的空间
引用是C++的叫法
取地址是C的叫法
简单说:
引用,需要一个对象
取地址,不用。
另:把引用说是指针,也不为过。其区别可以这么说
引用不能改变,指针可以改变。
引用有安全机制检查,指针没有。
引用的2大作用:
1)作为函数的参数,用于提高效率(如常量入参,返回类的成员变量的值)、返回数据...
作为函数的参数,用于提高效率这里主要是指用类实例作为参数,因为如果不是用引用,也不使用指针,
那么在参数的传递过程中,将有一个隐含的调用类的构造函数的操作,也就是说将构造一个新的类作为参数,
使用引用将避免这个过程,如果担心类中的成员被修改,那么可以再加上const修饰符
2)简化代码,使代码易读。如:
要使用a->b->c->d->e->f->g,g是一个多重嵌套类中的一个整数成员,书写很麻烦,也容易错。
这时:
int
&z
=a->b->c->d->e->f->g;
以后直接使用z,因为他们的存贮单元本来一致,所以也根本没有效率的损失。
--------------------------------------------------------------------------------------------------
//------------>怎样理解引用的作用和意义.
你是否感觉:&在几个用法中没有一致的性质可循.
下面我们就来探讨和总结一下:
#include <iostream>
#include <stdio.h>
using namespace std;
void main(void)
{
//测试引用是否可以赋以常量.
//考察引用和指针的使用区别
//测试对引用取址返回的结果
//测试是否可以重新赋值
//说明引用的一种错误用法..........
//测试引用和指针混合的情况...
typedef char* PChar;
typedef char& RChar;
typedef PChar& RPChar;
PChar str = "I am programming.";
RPChar rpchar = str;
cout<<str<<endl<<rpchar<<endl;
getchar();
}
*/
/***********
/*结论:对于int& a;引用实际是一种隐式指针,是方便编程而引入的,识别由编译器支持
.
在函数的使用中.可把它理解为跟后面的结合. int (&a);
在传递参数的过程中跟取地址值意思差不多.
/*
而在函数内部使用过程中则相当与数值.你可把它看作便利的原因.其实引用&
/*
是一个能自动被编译器逆向引用的常量型指针
总结:
...
/* A.常规使用:
/*
1. int a = 100;
/*
int &b = a;
/*
2. int a = 100;
/*
int &b = a;
/*
int &c = b;
/*
3. int a = 100;
/*
int &b; //必须定义时赋值,不同于指针(int a =
100;
/*
// int *p; p =&a;)
/*
b = a;
/*
4. int &a =
100; //不可将常量赋予引用...
/*
const int& a = 100;//可行,作全局看
/*
5. int a = 100;
/*
int &b = a;
/*
cout<<&b<<endl;
//输出的是a(也是b)的地址..而不是指针
/*
// 的地址...
/*
6. int a = 100;
/*
int &b = a;
/*
int
*ptr;
/*
ptr = &a;
/*
cout<<a<<b<<*ptr<<endl;
//结果是一样的..注意*ptr.
.
/*
7. int a =100;
/*
int b = 200;
/*
int &c = a;
/*
c =
b;
//引用可重新赋值...........
/*
/*B.较难的使用规则:
/*
1. 系列错误用法:
/*
char* str = "I am programming.";
/*
定义引用数组:int& a[3]; (定义指针数组:int* a[3];
)
/*
定义引用的指针:int&* a; (定义指针的指针:int** pt
r;
/*
定义引用的引用:int&& a;
/*
2. 可定义指针的引用:
int*& a = str; //When it must
/*
be initialized when definedv.
/*
/*C.引用在函数和对象域的使用
/*
1. 做函数返回类型的应用:(当然传递的参数类型为引用,那么
/*
是地址传递方式...)
/*
int arr[3] = {1,2,3};
/*
fook(2) =
100;
//函数返回的是引用,做左值时,编译
//器将其当作地址使用....
/*
//而如返回的是常量,那当然不可
//赋值
/*
int& fook(int index){ return (arr[index]+1);}
/*
/*
2.返回局部变量
/*
int& fook(param){
/*
int m = 100;
/*
return m;
/*
}
/*
//在函数结束生命周期后,返回的地址将不可用.
/*
/*
3.不好的对普通对象的引用
/*
class MClass;
/*
MClass* mcptr;
/*
mcptr = new MClass(param);
/*
if(!mcptr) MError("Constructing object failed.");
/*
MClass& mcref = *mcptr;
/*
也许上面的引用可以使你感觉更舒服的使用MClass: 如
/*
mcref.function();而不必
/*
(*mcptr).function();或mcptr->function();
/*
可是相比之下,一个严重的问题来了:内存泄露..
/*
因为引用不像指针那样明显:你很可能忘记:delete &mcref;
/*
/*
4.对对象相关的参数的引用
/*
void
fook(param1)
/*
{
/*
param->function(noramlparam);
/*
}
/*
上面的程式中,我想传递一个对象的地址,从而使用对象的成员函
/*
数..怎么办?
/*
/*
void fook(MClass* mcpptrparam){};
/*
恩,可以.
/*
用一用:
/*
MClass mcptr = new MClass(param);
/*
fook(mcptr);
/*
还有呢:
/*
MClass mcobj;
/*
fook(&mcobj);
/*
/*
当然你也可:
/*
void fook(MClass& mcrefparam){};
/*
这样引用的对象可在全局数据区、堆栈、栈
/*
5.当然引用真的就是为了方便吗?.......
/*
其实正如它在函数返回值里的应用,可由编译器识别为地址,在作
/*
为对象相关参数的
/*
引用里亦存在同样的好处,指针的引用可替换指针的指针,多变的
/*
工作....
http://blog.sina.com.cn/s/blog_46b7d6050100tvwn.html
[转载]& 引用 取地址的更多相关文章
- [转载]C++中 引用&与取地址&的区别
一个是用来传值的 一个是用来获取首地址的 &(引用)==>出现在变量声明语句中位于变量左边时,表示声明的是引用. 例如: int &rf; // 声明一个int型的引用r ...
- 详解C++中指针(*)、取地址(&)、解引用(*)与引用(&)的区别 (完整代码)
一.初步了解--指针与取地址 先看程序: #include<cstdio> int main(void) { int num = 7; int *p = # printf( ...
- C++中 引用&与取地址&的区别
微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...
- C++中引用与取地址
所谓引用就是为对象起一个别名.例如变量b = &a,b就是a的一个引用.对b的任何操作等同于对a的操作,也就是说,如果你改变了b的值,同时a的值也会发生改变.b就是a的另外一个名字,他们实质是 ...
- 取地址与解引用 C指针浅析
C语言指针入门需要掌握的两个概念就是取地址&和解引用*,下面我们按例子来理解这两个符号的使用. int main() { int a = 0; int* pa = &a;//取地址操作 ...
- 终于懂了:Delphi的函数名不是地址,取地址必须遵守Object Pascal的语法(Delphi和C的类比:指针、字符串、函数指针、内存分配等)good
这点是与C语言不一样的地方,以前我一直都没有明白这一点,所以总是不明白:函数地址再取地址算怎么回事? ------------------------------------------------- ...
- c语言 &取地址运算符的理解
对于c语言中的&运算符,百度百科是这样定义的:(&p)则是这样一种运算,返回当时声明p 时开辟的地址:但是根据我对代码的观察,我觉得&运算符不只是返回地址的功能: 例如: in ...
- C语言的数组名和对数组名取地址
http://blog.csdn.net/zdcsky123/article/details/6517811 相信不少的C语言初学者都知道,数组名相当于指针,指向数组的首地址,而函数名相当于函数指针, ...
- WCF 在VS中,添加服务引用,地址输入http://ip/Service.svc,点击前往,提示错误,内容如下:
WCF的service端的webconfig如下: <?xml version="1.0"?> <configuration> <system.ser ...
随机推荐
- 用PHP获取系统时间时,时间比当前时间少8个小时
自PHP5.0开始,用PHP获取系统时间时,时间比当前时间少8个小时.原因是PHP.ini中没有设置timezone时,PHP是使用的UTC时间,所以在中国时间要少8小时. 解决办法: 1.在PHP. ...
- 嵌入式Linux内核I2C子系统详解
1.1 I2C总线知识 1.1.1 I2C总线物理拓扑结构 I2C总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成.通信原理是通过对SCL和SDA线高 ...
- NHibernate系列文章二十六:NHibernate查询之SQL Query查询(附程序下载)
摘要 NHibernate在很早的版本就提供了SQL Query(原生SQL查询),对于很复杂的查询,如果使用其他的查询方式实现比较困难的时候,一般使用SQL Query.使用SQL Query是基于 ...
- flex4.0密钥及破解方式
输入下面的序列号: 1424-4507-0757-7016-8907-6937 1424-4785-4428-8084-6314-8733 1424-4794-9281-8063-2338-9079 ...
- 9.springMVC中的拦截器
springMVC中的拦截器大概大致可以分为以下几个步骤去学习: 1.自定义一个类实现HandlerInterceptor接口,这里要了解其中几个方法的作用 2.在springMVC的配置文件中添加拦 ...
- webform内置对象
1.Response和Request地址栏数据拼接 QueryString 优点:简单好用:速度快:不消耗服务器内存. 缺点:只能传字符串:保密性差(调转页面后在地址栏显示):长度有限.响应请求对象 ...
- URL Parsing
[URL Parsing] urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True) Parse a URL into six ...
- 为什么for(int i=0;i<9;i++) 在c语言中是错误的?
显示表示,i 变量不可以在for中定义,必须在外面定义,这是为什么? 因为C99标准以前的C标准是不支持临时变量在for循环中定义的. C99标准就支持这样写.但是目前有些编译器并不怎么愿意支持C99 ...
- BHP编译器教程
BHP编译器教程 BHP是一个WEB模版编程语言编译器,生成PHP后端代码. 最简单的Helloworld例子 编写一个hello.bhp文件 <? $hello="hello,wor ...
- vim global命令
global命令格式 : [range]global/{pattern}/{command} global命令在[range]指定的文本范围内(缺省为整个文件)查找{pattern},然后对匹配到的行 ...