2.19:说明指针与引用的主要区别?
引用,即别名,是给一个对象取别名,一旦给一个对象引用了,那么这个引用就与对象绑定在了一起,任何对该引用的操作,都是对变量的操作
一个引用与一个对象绑定了,就不能再与其他对象绑定,引用不是一个对象,没有内存空间,它必须在定义时初始化,它不像赋值一样是遵从拷贝
的操作。
指针,其存放了对象的地址,在其生命周期内,先后可以指向不同的对象,它必须初始化,不然会出现未定义的指针变量的值,指针本身也是对象,
也有其自身的内存空间,也可以使用解引用的操作去访问指针所指对象的值,指针与引用一样也必须遵从类型匹配,指针的值可以是空指针,也可以是
指向某个对象,或者指向某对象的地址的下一个位置。
2.20:请叙述下面这段代码的作用。
int i=42; //定义一个int类型的变量 i 并给它赋值为42
int *p1=&i; //int类型的指针p1存放着变量i的地址
*p1=*p1* *p1; //两个指针中的值相乘,然后再将结果赋值给p1指针。
2.21:请解释下述定义。在这些定义中有非法的吗?如果有,为什么?
int i=0;
(a) double* dp=&i; (b) int *ip=i; (c) int *p=&i;
a)非法。指针变量要求类型匹配,不能把int类型的变量的地址赋值给double类型的指针。
b)非法。指针变量存放的是地址,而不是变量值。
c)合法。
2.22:假设p是一个int型指针,请说明下述代码的含义。
if(p) //指针存放的地址若为空,则条件为假,即空指针,或者指针是无效指针;否则条件为真。
if(*p) //指针指向的对象的值若为0,则条件为假,否则条件为真。
2.23:给定指针p,你能知道它是否指向了一个合法的对象吗?如果能,叙述判断的思路:如果不能,也请说明原因?
如果一个指针,没有进行初始化,那么它指向的对象是未定义的,无法判断它指向的对象所在的内存空间是不是合法的,此时编译器会报错。
如果一个指针,经过了初始化,并且再对象定义之后,那么在使用它时,如果它指向了一个对象,只要这个对象具有和给定指针的对象相同类型的,且有自己的存储空间,
那么即可以说指向的对象合法。
2.24:在下面这段代码中为什么p合法而lp不合法?
int i=42; void *p=&i; long *lp=&i;
因为指针p是void* 类型的,所以可以存放任意类型的对象,而指针变量需要类型匹配,指针lp是long* 类型的,所以不能将int类型变量的地址给lp。