C++语法难点(声明和定义,指针的引用,对常量的引用,指向常量的指针,常量指针)持续更新中

变量声明和定义的关系

声明的存在允许把程序拆分成多个逻辑部分来编写,支持分离式编译。声明使得名字为程序所知,一个文件如果想使用别处定义的名字就必须包含对那个名字的声明,而定义负责创建与名字关联的实体。

声明一个变量,就在变量名前添加关键字extern,而且不要显式地初始化变量。

extern int i;  // 声明 i 而非定义 i
int j;         // 定义 j

任何包含了显式初始化的声明即成为定义,这么做会抵消 extern 的作用。

extern double pi = 3.14;  // 定义

变量能且只能被定义一次,但是可以被多次声明。

指针的引用

引用本身不是一个对象,因此不能定义指向引用的指针。但是指针是对象,所以存在对指针的引用。

int i = 42;
int *p;			// p是一个int型的指针
int *&r = p;	// r是一个对指针p的引用

r = &i;			// r引用了一个指针,因此给r赋值就是令p指向i
*r = 0;			// 解引用r得到i,也就是p指向的对象,将i赋值为0

对常量的引用

与普通引用不同的是,对常量的引用不能用作修改它所绑定的对象。

const int ci = 1024;
const int &r1 = ci;     // 正确:引用及其对应的对象都是常量
r1 = 42;                // 错误:r1是对常量的引用
int &r2 = ci;           // 错误:试图让一个非常量引用指向一个常量对象

因为不允许直接对ci赋值,当然也就不能通过引用去改变ci。因此对r2的初始化是错误的。假设该初始化合法,则可以通过r2来改变他引用对象的值,这显然是不正确的。

指向常量的指针

指向常量的指针不能用于改变其所指对象的值,要想存放常量对象的地址只能使用指向常量的指针。

const double pi = 3.14;     // pi是个常量,它的值不能改变
double *ptr = π          // 错误:ptr是一个普通指针
const double *cptr = π   // 正确:cptr可以指向一个双精度常量
*cptr = 42;                 // 错误:不能给*cptr赋值

允许一个指向常量的指针指向一个非常量对象,但是不能通过指向常量的指针修改常量对象的值。

double dval = 3.14;
cptr = &dval;

常量指针

常量指针,把指针本身定义为常量。常量指针必须初始化,而且一旦初始化完成,则它的值(也就是存放在指针中的那个地址)就不能再改变了。

int errNumb = 0;
int *const curErr = &errNumb;   // curErr将一直指向errNumb
const double pi = 3.14;
const double *const pip = π  // pip是一个指向常量对象的常量指针

常量指针的作用类似于数组名,都是存放一个地址,但是本身的值不可改变。

持续更新中。。。

posted @ 2022-02-08 11:02  垆边画船听雨眠  阅读(72)  评论(0编辑  收藏  举报