C++ | 引用和指针
引用(reference)
引用(reference)是给对象起的另一个名字,引用本身不是对象,而是对象的别名。
引用类型定义语法如下:
int A = 9; int &refA = A; // refA是A的引用,及refA是A的别名 int &refA2; // 报错:引用必须被初始化
一般初始化变量时,是把初始值拷贝到新建的对象中。然而定义引用是,程序会把引用和初始值绑定在一起,而不是把初始值拷贝给引用。初始化完成时,引用就与其初始值对象一直绑定在一起,因此引用定义时必须被初始化且引用定义后无法再绑定其他对象。
指针(pointer)
指针是指向另一种类型的符合类型。指针与引用都实现了对其他对象的间接访问。
指针与引用的不同点。第一,指针本身是对象,可以对指针进行赋值和拷贝操作;第二指针无需在声明时初始化。
指针类型定义语法:
int A = 9; int *pA = &A; // 定义指针pA并将其指向A的地址 int *pB; // 定义指针pB
Tips:
指针变量的大小取决于编译器,在64位编译器中对指针变量进行sizeof()操作值为8,在32位编译器中则为4。
利用指针访问对象需要对指针进行解引用操作,解引用符(操作符*)
int A = 9; int *pA = &A; // 定义指针pA并将其指向A的地址 *pA = 99; // A的值变为99
指向指针的指针
int A = 9; int *pA = &A; // pA指向一个int类型的数 int *ppA = &pA; // ppA指向一个int类型的指针
三者关系如下:
就像接引一个指向int类型的指针会得到一个int类型的数一样,解引用一个指向指针的指针会得到一个指针。也就是说*ppA会得到pA,若要得到A就需要对指针的指针进行两次解引用,及**ppA。
指向指针的引用
顾名思义,指向指针的引用就是指针变量的别名,使用语法如下:
int A = 9; int *pA = &A; int *&ref = pA; // ref就是对指针pA的引用
const的引用
const定义常量对象,所以const的引用是对常量对象的引用。使用语法如下:
const int A = 9; int C; const int &refA = A; // 定义常量引用 refA = 99; // 报错:refA是常量对象的别名,而常量对象不可修改 int &refB = A; // 报错:试图让一个非常量引用指向一个常量对象 const int &refC = C; // 允许将const int&绑定到一个普通的int对象上
指针和const
指向常量的指针,使用语法如下:
const int A = 9; int *pA = &A; // 错误:pA是一个普通指针 const int *pB = &A; // 正确 *pB = 99; // 错误:pB指向一个常量,所以不能给*pB赋值
const指针
指针是一个对象,因此也能将指针声明为常量指针,与其他常量对象一样,常量指针必须在声明时初始化,语法如下:
int A = 9; int *const pA = &A; // pA将一直指向A const int *const pB = &A; // pB是一个指向常量对象的常量指针
划重点
pA与pB都是常量指针,但指向的对象不同。如何通过声明语法来区分呢。
用从右向左阅读的方法,int *const pA 中pA的左边是const,则表示pA是一个常量对象,声明符中的下一个符号是*,则表示pA是一个常量指针。最后,声明语句的基本数据类型部分确定了常量指针指向的是一个int对象。与pA相似的pB也是一个常量指定,但其指向一个int类型常量。
常量指针和指针常量。常量指针如上,表示指针是一个常量对象,即指针必须在声明时初始化,且一直指向初始化的变量。
在了解指针常量前我们先来学习其声明语法:
int A = 9; const int *pA = &A; // 声明指针常量 *pA = 10; // 报错
用从右向左阅读的方法来理解const int *pA,pA的左边是操作符*,这表示pA是一个指针对象,声明语句的基本数据类型部分确定了pA指向一个int类型的常量对象。
常量指针与指针常量小结:
常量指针(int *const pA = &A;):指针对象不可修改,但指针指向的对象可以修改;
指针常量(const int *pA = &A;):指针对象可以修改,但指针指向的对象不可修改。
#c++学习##c++指针##c++引用#