引用:&
` 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* 指针