引用
引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。
引用的声明方法:
类型标识符 &引用名=目标变量名;与定义指针相似,只是用&代替了*。引用(reference)是c++对c语言的重要扩充。
Discussion:
1.&在声明中不是取地址运算,而是起标识作用
2.类型标识符是指目标变量的类型
3.声明引用时,必须同时对其进行初始化。
4.引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名(从一而终)。
5.对引用求地址,就是对目标变量求地址。
引用作为参数:1
.相当可变参数;2.给函数传递大型对象
voidswapint(int&a,int&b)
{
inttemp;
temp=a;
a=b;
b=temp;
}
调用该函数的c++方法为:swapint(x,y); c++自动把x,y的地址作为参数传递给swapint函数。
当大型对象被传递给函数时,使用
引用参数可使参数传递效率得到提高,因为引用并不产生对象的副本,也就是参数传递时,对象无须复制。
常引用:声明方式:const 类型标识符&引用名=目标变量名
int a ;
const int &ra=a;
ra=1; //错误
a=1; //正确
引用和指针的区别
------相同点:
1. 都是地址的概念;指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名;可在一定程序上理解为变量的const指针(不是const 变量指针)
------区别:
1. 指针是一个实体,而引用仅是个别名;
2. 引用使用时无需解引用(*),指针需要解引用;
3. 引用只能在定义时被初始化一次,之后不可变;指针可变;(引用“从一而终”)
4. 引用没有 const,指针有 const,const 的指针不可变;
5. 引用不能为空,指针可以为空;
6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;
7.从内存上来讲 系统为指针分寸内存空间,而引用与绑定的对象共享内存空间,系统不为引用变量分配内容空间。但是当引用作为成员时,其占用空间与指针相同(没找到标准的规定)。
8. 指针和引用的自增(++)运算意义不一样;
指针
指针作参数常见问题:
1.指针做参数时对指针值的修改:(
区别指针的值和 指针所指变量的值)
//交换两整数
void change(int *data1, int *data2) {
int *temp;
//交换两数的地址
temp = data1;
data1 = data2; //修改参数1的地址
data2 = temp; //修改参数2的地址
//交换后的地址在函数内没问题,但不能传回主程序
printf("change:data1=%d, data2=%d\n", *data1, *data2);
return ;
}
指针做参数和正常变量名做参数一样,改变它的值,对外部没有影响。要想产生影响,只能通过dereference 指针,即*pointer来操作。
2.用局部变量的地址作返回值
#include <stdio.h>
int *setData(void) {
int arr[3] ; //| static int arr[3] ;
arr[0] = 10 ;
arr[1] = 35 ;
arr[2] = 48 ;
return arr ; //局部变量随函数结束而消亡,因此,返回之后是不正确的
}
int main(void)
{
int i ;
int *rst ;
rst = setData();
for (i=0; i<3; i++) {
printf("%3d\n", rst[i]);
}
return 0;
}
上面的错误是将消亡的地址返回,修正的方法可以考虑2种,一是将函数中的数组改为静态的。另一种办法是再动态申请内存。这样修改之后固然正确,但如果主程序中的rst改为数组,结果又怎样呢?这将导致编译错误。因为数组的地址不能被修改。
跟Objc中(NSError * __autoreleasing *)error不同,因为*error 是autoreleasing的。
3.双重指针作参数
在函数内部想改变指针的值,就用双重指针做参数。