C++ Primer 指针,引用笔记

引用:&

` int ival = 1024;

int &refVal = ival;

int &refVal2 // ! 引用必须初始化!而且无法解绑!!!

int &refVal3 = refVal; // 正确! 这里其实是绑定到ival 上

int i = refVal ; // 正确!!这里i 被初始化为ival 的值

`

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

但是 类型不匹配是不行的!

int & refVal4 = 10; // 不行!!!,因为引用必须绑定的是一个对象!!

double dval = 3.14;

int & refVa5l =dval; // 不行!!类型不匹配!

指针(pointer) 1 指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针的生活周期内它可以先后指向不同的对象。 2 指针无需在定义时赋初值,(一旦没有初始化,会将拥有一个不确定的值)

`
int *ip1 , *ip2;

double dp, *dp2;

int ival = 42;

int *p = &ival; // 指针存放某个地方的地址!获取地址试用&取地址符

// 因为引用不是对象,没有实际地址,所以不能定义指向引用的指针!!!

`
指针的值(即地址)应该是下列4种状态之一:

1 指向一个对象
2 指向紧邻对象所占空间的下一个位置
3 空指针,意味着指针没有指向任何对象
4 无效指针,也就是上述情况之外的其他值

`利用指针访问对象:

如果指针指向了一个对象,则允许使用解引用符(*) 来访问对象

int ival = 42;

int *p =&ival;

count<< *p ; // 输出42 , p存放着变量ival 的地址,或者说p是指向ival 的指针

*p = 0;
count<< p ; // 为p 赋值,实际上是为p所指的对象赋值
`

空指针(null pointer) :

int *p1 = nullpter; //等价于int *p1 = 0

int *p2 = 0; // 初始化p2为字面常量

int *p3 = Null ; // 等价于int *p3 = 0

int ival = 1024;

int *pi = 0;

int *pi2 = &ival;

== : 比较的是两个指针的地址,如果为True 有三种情况 : 1 它们都为空 2 都指向同一个对象 3 都指向了同一个对象的下一地址。:

(特殊情况, 一个指针指向了某对象,同时另外一个指针指向了另外对象的下一地址,此时也有可能出现两个指针相同的情况,即指针相等)

Void* 指针

是一种特殊的指针,可以用于存放任意对象的地址,一个*void 指针存放着一个地址,但是与其他不同的是,我们对这个地址到底是什么类型并不了解

概括来说,我们以void 的视角来看内存空间也就仅仅是内存空间,没办法访问内存空间的对象

我们更多的是拿它来跟别的指针来比较,所谓函数输入,输出,或者赋值给另外一个void* 指针

理解复合类型的声明:

int i = 1024 , *p = &i, &r = i; // i是int类型,p是一个int型指针, r是一个int 型引用

* 仅仅是修饰p而已,int* 写在一起,如:int* p 这个*依然是修饰p 的跟int没什么关系,基本数据类型是 int

int* p1, p2; // p1 是指针, 而p2 是int

指向指针的指针:

int ival = 1024; 可通过ival 来访问1024

int p = &ival; // pi指向int 型的数 , 可通过pi 来访问1024

int ppi = π // ppi指向int 型的指针,可通过ppi来访问 1024

指向指针的引用:

不能定义指向引用的指针!!! 因为引用本身不是一个对象

```
int i = 42;

int *p ; // p 是一个int 型的指针

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

r = &i; // r引用了一个指针,所以等同于令p指向 i

*r = 0; // 解引用r ,得到 i ,也就是p指向的对象,将i 的值改为 0

      从右向左阅读!!!距离最近的符号(此例中 &r 的& )就是说明了r是个引用!其余部分表明r 引用是个int 的指针



   



            
















posted @ 2020-11-13 20:25  UXCcccc  阅读(69)  评论(0)    收藏  举报