1: 在c++中,我们能够通过对象名字访问一个对象。但与此同时,存储在内存中的对象在内存中有一个具体地址,因此我们也能够通过该具体地址访问该对象,指针存储着内存地址。
2:在c++旧标准中,我们使用0或者是NULL来表示零指针,零指针表示该指针不指向任何对象。当我们使用0来表示零指针时,它很容易与整形的0混淆;NULL是个宏,一般来说在c++中NULL被如下定义:#define NULL 0
,然后在不同的执行环境下,NULL的定义可能略有不同,NULL或许是0也或许是0L,并且由于这个宏定义,我们也可用用NULL给整形变量赋初值0,这就违背了它涉及的初衷了,并且在c语言中,NULL被定义为#define NULL void(*)0,这使得在c++中使用它给具有具体类型的指针赋初值是不合法的,如int* p=null (error)
。因此在c++11新标准中,我们提倡使用nullptr来表示零指针,同时要注意的是nullptr可以给各种类型的指针赋值,并不是说每种类型的零指针都有一个各自的零指针。
3: 当我们通过编译器输出指针的地址值时,这个值是用十六进制表示的整型常量,也就是以0x开头。
4:指向相同类型数组的指针之间能够做减法操作,指针之间的加法操作为定义。同时指向数组的指针也能够加一个整数或者是减一个整数,但若其结果超出了数组范围,则对该指针的解引用是未定义的。复杂的指针算术操作应该被避免。一般在c++中,我们会使用vector容器类型代替数组的使用。
5:用T代表类型,const T *p=p0,在这里表示的是指针p指向的对象值不能被更改,如*p=T()就会出现编译错误,但p=p1正确。T *const p=p0表示的是指针p0存储的地址值不能被更改,但其所指向的对象的值能够被更改,因此*p=T()正确,但p=p1就会出现编译错误。
6:在c++新标准中,引用分为左值引用,const 引用和右值引用。
1. 左值:左值可以出现在赋值表达式的左边或右边,有固定的内存地址,如变量;
2. 右值:只能出现在赋值表达式的右边,不能被赋值,如字面值常量和在表达式求值过程中创建的临时对象。右值引用有一个重要性质是其只能绑定到一个将要销毁的对象,因此我们可以自由的将一个右值引用的资源移动到另一对象中。
3. const 引用:const 引用即可以绑定到相同类型的对象(左值),又可以绑定到不同但相关的类型的对象(左值),同时还可以绑定到右值。
4. 引用不是一个对象,因此不能用数组表示引用的集合,如`vector<string&>,string& a1[]`这样的表示是错误。