引用(reference)为对象起了另外一个名字,引用类型引用另外一种类型,通过将声明写成&d的形式来定义引用类型,其中d是声明的变量名。
主要是区别好"&"在声明的时候是作为引用来用,其他情况都是解地址符。
定义独立引用时需要注意以下规则:
- 引用型变量在定义时必须初始化。
- 被引用的对象必须已经分配了空间,即不能为空,或空指针。
- 被引用的对象不能为地址,即指针变量、数组变量等不能被引用。
引用定义举例:
#include <iostream>
using namespace std;
#include "FouYinyong.h"
int main(int argc, const char * argv[])
{
int a ;
int &b = a; //&在这里,b引用了a
b = 1024; //实际也是给a赋值
cout<< a << endl;
bool isEqule = &a == &b; //比较他们俩的地址
cout<< isEqule << endl;
cout << "a与b的地址"<<endl;
cout <<&a<<"|||"<<&b<<endl;
return 0;
/*-------▼下面代码有错,注释后才能运行▼-----------
int x[] = {12,15,20} ;
int &y = x; //错误:数组、指针不能被引用
int x1;
int &y1; //错误:引用时必须初始化
y1 = x1;
-------▲上面代码有错,注释后才能运行▲-----------*/
}
输出结果:
1024
1
a与b的地址
0x7fff5fbff88c|||0x7fff5fbff88c
引用作为参数的例子
#include "FouYinyong.h"
#include <iostream>
using namespace::std;
FouYinyong::FouYinyong(){
}
void FouYinyong::swap(int &x ,int &y){ //FouYinyong::swap(int *x,int *y){
cout << "x>>>>"<<x <<"|||y>>>"<<y<<endl;
int temp; // int temp
temp = x; // temp = *x;
x = y; // *x = *y;
y = temp; // *y =temp;
cout << "x>>>>"<<x <<"|||y>>>"<<y<<endl;
} //}
void FouYinyong::doSwap(){
int x = 12;
int y = 33;
int &a = x;
int &b = y;
swap(a, b);
}
上面的代码右边注释部分是指针。
引用并非对象,相反的,它只是为了一个已经存在的对象所起的另外一个名字。所以在使用引用的时候,不需要加上&号,只是在定义的时候加上&号。
不过我还是不太明白引用在哪些情况下需要用到,如果懂的朋友,请指点一下。
错误的引用用法:
int &a = 10; //错误,引用类型的初始值必需是一个已分配地址空间的对象
double dval = 3.14;
int &reval = dval ; // 错误:此处引用类型必须是int类型
指针(pointer)是指向(point to )另外一种 类型的复合类型(引用也是复合类型),与引用类似,指针也实现了对其他对象的间接访问。
#include <iostream>
using namespace std;
//有两个与指针变量有关的运算符:
// &取地址运算符。
// *指针运算符(或称间接访问运算符)。
int main() {
cout << "C++指针学习" << endl;
int a;
a = 110;
int *p ; //int *p = &a; *p被初始化,并存有i的地址
p = &a ;// *p的地址(p)改变为&a,改变了指针所指向的对象
*p = 98765; //*p的值改变了,改变了指针所指向对象的值
cout <<"p指针::" << *p <<endl;
cout <<"a::" << a <<endl;
cout <<"p指针指向的地址::" << p <<endl;
cout <<"p指针指向的地址::" << &*p <<endl;
cout <<"a的地址::"<<&a<<endl;
return 0;
}
引用与指针的区分
int i = 10;
int &r = i; //&紧随类型名出现,因此是声明的一部分,r是一个引用。(引用使用之时不需要带&)
int *p; //*紧随类型名出现,因此是声明的一部分,p是一个指针
p = &i; //&出现在表达式中,是一个取地址符。改变了p的地址,即改变了p指向的对象
*p = i; //*出现在表达式中,是一个解引用符
int &r2 = *p //&是声明的一部分,所以是r2是一个引用
主要是区别好"&"在声明的时候是作为引用来用,其他情况都是解地址符。