1.引用类型
c++11新增加的一种引用,引用为对象起了另一个名字。程序把引用和它的初始值绑定在一起,不是将初始值拷贝给引用。一旦初始化完成,引用将和他的初始值绑定。引用必须初始化,定义引用为&a ,a为变量。
int i=1024;
int &ref1 = i;// ref1是变量i的引用, ref1指向 i (i 的名一个名字)
//int &ref2;//报错 没有初始化
ref1 = 2; //把2赋值给ref1指向的对象,即 i=1024;
std::cout<< i ; //i=2
int ii = ref1; //ii
std::cout<< i; //ii=2;
int &ref3=ref1;
std::cout<< ref3; //ref3=2
int j= ref1;
std::cout<< j;//j=2;
// int &ref4=0;//错误 引用类型的初始值必须是对象
double d = 3.14;
// int &ref5 = d; //引用类型的初始值必须是int型对象
2.指针类型
指针 是指向 另一种类型的复合类型。与引用类似,指针也实现了对其他对象的简介访问。指针本身是对象,允许对指针赋值和拷贝。指针不必在定义时赋初始值,如果在块作用域内定义的指针如果没有初始化,也将拥有一个不确定的值。定义指针为*a ,其中a是变量名,如果要定义多个指针变量,每个变量前都得有*。
*ip1,*ip2;//ip1和ip2都是指向int型对象的指针
dp1,*dp2;//dp1是double型对象,dp2是指向double型对象的指针;
获得对象的地址需要用到取地址符 &;
double dval;
double *pd = &dval;
double *pd2 = pd;
// int *pi = pd;//错误 类型不匹配
// pi = &dval;//错误 试图把double型对象的地址赋值给int型指针
利用指针访问对象 需要用到解引用符 * 来访问
int ival = 1024;
int *ip = &ival;
std::cout<< ip; //ip存储的地址 即ival的地址
std::cout<< *ip; //ip所指向对象的值 1024
*ip = 10; //p为ival赋值 即 ival = 10
std::cout<<*ip;//10
std::cout<<ival;//10
指向指针的指针 **p
int i = 1024;
int *p = &i;//p指向一个int型的对象
int **pp = &p;//pp指向一个int型的指针
std::cout<<pp;
std::cout<<*pp;
std::cout<<**pp;
指向指针的引用 *&rp
int i = 1024;
int *p;//p是一个int型的指针
int *&pr = p;//pr是一个对指针p的引用
pr = &i;//pr引用了一个指针,因此给pr赋值&i就是令p指向i;
std::cout<<i;
std::cout<<"\n";
std::cout<<*p;
std::cout<<"\n";
std::cout<<pr;
std::cout<<"\n";
std::cout<<*pr;
*pr = 10;//解引用pr得到i,也就是p指向的对象,将i的值改为10;
std::cout<<"\n---------\n";
std::cout<<i;
std::cout<<"\n";
std::cout<<*p;
std::cout<<"\n";
std::cout<<pr;
std::cout<<"\n";
std::cout<<*pr;
3. & 与 * 的多重含义
int i = 1024;
int &ir = i; //&紧随类型名出现,因此是声明的一部分,ir 是一个引用
int *p;//*紧随类型名出现,因此是声明的一部分,p是一个指针
p=&i;//&出现在表达式中,是一个取址符
*p=i;//*出现在表达式中,是一个解引用符
int &r2 = *p;//&是声明的一部分,*是一个解引用符