Chapter 2引用和指针
引用:
2.15 下面的哪个是不合法的?为什么?
(a)int ival = 1.01; (b)int &rvall = 1.01;
(c)int &rval2 = ival; (d)int &rval3;
b、d不合法,因为c++中的引用必须初始化且跟对象绑定在一起
2.16 考察下面的所有赋值然后回答:哪些赋值是不合法的?为什么?哪些赋值是合法的?它们执行了什么样的操作?
int i = 0, &r1 = i; double d = 0, &r2 = d;
(a) r2 = 3.14159; (b)r2 = r1;
(c) i = r2; (d)r1 = d;
b不合法。因为无法令引用重新绑定到另外一个对象。
(a) d = 3.14159
(c) i = 0;
(d) i = 0;
2.17 执行下面的代码段将输出什么结果?
1 int i, &ri = i; 2 i = 5; ri = 10; 3 std::cout << i << " " << ri << std::endl;
输出 : 10 10
指针:
2.18 编写代码分别更改指针的值并且指针所指对象的值
1 #include<iostream> 2 int main() 3 { 4 int a = 1,b = 2; 5 int *p = &a; 6 std::cout << a << " " << b << std::endl; 7 p = p + 1; //更改指针的值 8 std::cout << a << std::endl; 9 p = &b;//修改指针所指的值 10 std::cout << *p << std::endl; 11 return 0; 12 }
2.18 说明指针和引用的主要区别
引用只能绑定一次,然后就不能修改所绑定的对象,对引用的操作都是在对其最先绑定的对象进行的。而指针所指向的对象可以修改,指针赋值是令其存放一个地址。
2.20 请叙述下面这段代码的作用
1 int i = 42; 2 int *p1 = &i; 3 *p1 = *p1 * *p1;
求i的平方
2.21 请解释下述定义。在这些定义中有非法的吗?如果有,为什么?
int i = 0;
(a) double* dp = &i; (b)int *ip = i; (c)int *p = &i;
(a) 非法,指针声明类型和指向类型不一致
(b) 非法,不能把int类型直接赋给指针
(c) 合法
2.22 假设p是一个int型指针,请说明下述代码的含义。
if(p) // ... p为0,false
if(*p) //... p为空指针,false
2.23 假定指针p,你能知道它是否指向了一个合法的对象吗?如果能,叙述判断的思路;如果不能,也请说明理由。
不能,因为,如果指针没有初始化,则它指向一块不确定的内存,如果那块内存原先有内容,而这些内容又被当做了某个地址,就很难分清是合法的还是非法的了。而如果指针没有被合法的初始化,恶意地存放了一个地址,也是很危险的。
2.24 在这段代码中为什么p合法而lp非法?
int i = 42; void *p = &i; long *lp = &i;
void* 可以存放任意对象的地址,所以p合法。
lp指针声明和i类型不同,不合法。
2.25 说明下列变量的类型和值
(a) int* ip,i, &r = i; (b) int i, *ip = 0; (c) int* ip, ip2;
(a) ip是一个int型指针,其值不确定;i是一个int型变量,值不确定;r是对i的引用,值同样不确定
(b) i是int型指针,值不确定;ip是int型指针,其值为NULL
(c) ip是int型指针,值不确定,ip2是int型变量