C/C++中的取地址与引用

取地址和引用都采用&的标识符,很容易让人造成误会。

就c/C++而言。引用只是C++中的知识,而取地址是两者共有的。

取地址:

在第6行中我定义了一个指向int类型的指针p,运用&a获取a的地址,并将a的地址赋予它,即p指向a所在的空间。

在第7行中取p所指向空间的值(*:有个高端名字叫解引用)输出。

引用:

在第6行我定义了一个引用b,并将a赋予b。其实质就是给a取了一个小名叫b。对a操作就是对b操作,如果改变b的值(eg。b=20),那么a的值也相应改变(a也会等于20)

从第7、8行更能反应我上面说的,a和b的值相等,并且地址也相同。因此引用是不占用空间的,仅仅是个别名而已。

在函数调用的时候也可能会混淆引用与取地址:

先看一下第2、3行的函数原型。两个函数的功能都是交换两个数。swap1的两个形参都是指针,而swap2的形参是两个引用。

再看一下第8行、第9行,调用swap1的时候传了两个地址给它(x=&a,y=&b),即x指向a的空间,y指向b的空间。调用swap2的时候传了两个引用给它(x=a,y=b),即x只是a的一个别名,y是b的一个别名,实则都代表同一块空间。

函数调用的时候,引用相对于指针来说更高效、跟简便。因为指针传参的实质还是传值调用,copy地址需要开销,而引用直接被编译器优化。有些时候需要二级指针的地方,使用指针的引用会使问题简化很多,我在对树的操作的时候就碰到过,大家可以感受一下。

时间: 2024-11-07 16:13:36

C/C++中的取地址与引用的相关文章

JS 中没有按地址(引用)传递,只有按值传递

很多人,包括我,受书本知识消化不彻底的影响,认为 JS 中参数有两种传递方式:数字.字符串等按值传递:数组.对象等按地址(引用)传递.对此种观点,我们要谨慎. var v1 = []var v2 = {};var v3 = {};function foo(v1, v2, v3){    v1 = [1];    v2 = [2];    v3 = {a:3}} foo(v1, v2, v3);alert (v1); // 空白 alert (v2); // [object Object] ale

php的foreach中使用取地址符,注意释放

一说起这,就想到那次去360面试的面试题,当时毕竟图样,答错了哈哈~顺便说下,那时的技术面倒是通过了哈哈~ 先来举个例子,类似的面试题. 1 <?php 2 3 $array = array(1, 2, 3); 4 5 foreach ($array as &$value) {} 6 7 // unset($value); 8 9 foreach ($array as $value) { 10 // print_r($array); 11 } 12 13 echo implode($arra

[转载]C++中 引用&amp;与取地址&amp;的区别

一个是用来传值的 一个是用来获取首地址的 &(引用)==>出现在变量声明语句中位于变量左边时,表示声明的是引用.     例如: int &rf; // 声明一个int型的引用rf.&(取地址运算符)==>在给变量赋初值时出现在等号右边或在执行语句中作为一元运算符出现时                  表示取对象的地址. 在C++中,既有引用又有取地址,好多人对引用和取地址不是很清楚,因此也无法区分.其实他们的区别可以用一句话概括:和类型在一起的是引用,和变量在一起的

引用与取地址

一个是用来传值的 一个是用来获取首地址的 &(引用)==>出现在变量声明语句中位于变量左边时,表示声明的是引用.     例如: int &rf; // 声明一个int型的引用rf.&(取地址运算符)==>在给变量赋初值时出现在等号右边或在执行语句中作为一元运算符出现时                  表示取对象的地址. 在C++中,既有引用又有取地址,好多人对引用和取地址不是很清楚,因此也无法区分.其实他们的区别可以用一句话概括:和类型在一起的是引用,和变量在一起的

引用和取地址区别

一个是用来传值的 一个是用来获取首地址的 &(引用)==>出现在变量声明语句中位于变量左边时,表示声明的是引用.     例如: int &rf; // 声明一个int型的引用rf.&(取地址运算符)==>在给变量赋初值时出现在等号右边或在执行语句中作为一元运算符出现时                  表示取对象的地址. 在C++中,既有引用又有取地址,好多人对引用和取地址不是很清楚,因此也无法区分.其实他们的区别可以用一句话概括:和类型在一起的是引用,和变量在一起的

C语言中对数组名取地址

在C/C++中,数组名相当于一个指针,指向数组的首地址.这里"相当于"不代表等于,数组名和指针还是有很多区别的,这个在<C陷阱与缺陷>里有详尽的讲述.而这里要说的是对于数组名取地址的这么一个操作. 如果声明有如下数组: int arr[5]; 那么,&arr这个操作得到了什么值呢? 如果简单的认为arr就是一个指向数组首地址的指针的话,那么很自然会想到&arr得到的是一个指向存放arr这个指针的指针,也就是一个二级指针,然而事实却并不是这样. 观察以下代码:

如何使用JAVA语言抓取某个网页中的邮箱地址

现实生活中咱们常常在浏览网页时看到自己需要的信息,但由于信息过于庞大而又不能逐个保存下来. 接下来,咱们就以获取邮箱地址为例,使用java语言抓取网页中的邮箱地址 实现思路如下: 1.使用Java.net.URL对象,绑定网络上某一个网页的地址 2.通过java.net.URL对象的openConnection()方法获得一个URLConnection对象 3.通过URLConnection对象的getInputStream()方法获得该网络文件的输入流对象InputStream 4.循环读取流

Delphi中使用@取函数地址的问题(转)

Delphi中使用@取函数地址的问题 例如以下代码:unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs;type  TForm1 = class(TForm)    procedure one();    function two(x,y:integer):integer;  private    { Private declarat

C语言中与指针相关问题——论数组名和数组名取地址的关系

这是由一道面试题联想到的一些问题,这里自己给做个小总结! 首先看看这道面试题: #include <stdio.h> int main() { int a[5] = { 1, 2, 3, 4, 5 }; int *pi = &a + 1; printf("%d, %d\n", *(a + 1), *(pi - 1)); return 0; } 答案是2, 5.至于是为什么,我后面说一下我自己的理解. 这里有个要注意的地方,以上代码在CodeBlock中会有个警告,但