引用和指针的那些事

2.3.1 引用

引用并非对象,相反的,它只是为一个已存在对象所起的另外一个名字。
示例:
int ival = 1024;
int &refVal = ival;

Tips:
1.除2种情况外,引用的类型要和与之绑定的对象严格匹配

2.引用必须被初始化,且一旦初始化后,它和初始值对象一直绑定在一起,不能更改绑定的对象

3.引用本身不是一个对象,所以不能定义引用的引用

2.3.2 指针
取地址符(操作符&), 解引用符(操作符*)
示例:
int ival = 42;
int *p = &ival;

指针的4种状态:
a. 指向一个对象
b.指向相邻对象所占空间的下一个位置
c. 空指针,指针没有指向任何对象
d. 无效指针,就是上述情况外的其他值

如果指针指向了一个对象,则允许使用解引用符*来访问该对象(解引用,仅用于有指定对象的有效指针):
如上例操作对象,直接用 *P。

空指针的3种生成方式:
a. int *p1 = nullptr; (C++11新引入,推荐使用)

b. int *p2 = 0;

c. int *p3 = NULL;

Tips:
1.除2种情况外,指针的类型要和它指定的对象严格匹配。

2.建议初始化所有指针。

3.赋值操作时,永远改变的是等号左侧的对象。
int *pi = 0;
pi = &ival; //pi的值被改变,现在pi指向了ival
*pi = 0; //ivald的值发生改变

4.将指针作为if语句的判断条件时,指针值为0,则为false;指针值非0,则为true。

5.void*指针可用于存放任意对象的地址,其内存空间仅仅是内存空间,没法访问内存空间所存的对象,
所以void* 指针能做的事比较有限: 拿它和别的指针比较;作为函数的输入或输出,或者赋值给另外一个void*指针

补充(理解复合类型的声明:):
1.
int* p1,p2; //p1是指向int的指针,p2是int型整数
int *p1,*p2; //p1和p2都是指向int的指针

2.指向指针的指针:
通过*的个数可以区分指针的级别,如**表示指向指针的指针。***表示指向指针的指针的指针。,如:
int ival = 1024;
int *pi = &ival; //pi指向一个int型的数(ival)
int **pi = π //ppi指向一个int型指针(pi)

3.面对比较复杂的指针或者引用的声明语句时,从右向左阅读有助于弄清它的真实含义。如:
int i =42;
int *p; //p是一个int型的指针
int *&r = p; //r是一个对指针p的引用

r = &i;
*r=0;

第三行,要理解r的类型到底是什么,从右到左阅读r的定义。离变量名r最近的符号(此例是&r符号的&)对变量的类型最直接的影响,
因此r是一个引用,声明符的其他部分用来确定r引用的类型是什么(此例中的符号*,说明r引用是一个指针)

2.4 const限定符

猜你喜欢

转载自www.cnblogs.com/tsinghuama/p/9930540.html