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型变量

 

posted @ 2018-03-14 15:40  抹茶奶绿不加冰  阅读(282)  评论(0编辑  收藏  举报