练习2.18
编写代码分别更改指针的值以及指针所指向对象的值。
解答:
#include <iostream>
using namespace std;
int main(){
int num1 = 10, num2 = 20;
int *p = &num1;
*p = 100;
p = &num2;
cout << num1 << endl;
cout << *p << endl;
}
练习2.19
说明指针和引用的主要区别。
解答:
其实二者都是指向一个以存在的对象。
不过,指针可以为空,也就是不需要进行初始化,而引用不行。
同样的,指针需要占用对应的空间,而引用只是个“别名”而已,所以引用不需要开辟新的空间。
练习2.20
请叙述下面这段代码的作用。
int i = 42;
int *p1 = &i;
*p1 = *p1 * *p1;
解答:
求一个数的平方数。
练习2.21
请解释下述定义。在这些定义中有非法的吗?如果有,为什么?
int i = 0;
(a) double *dp = &i;
(b) int *ip = i;
(c) int *p = &i;
解答:
(a) 非法,无法用double类型的指针指向一个int类型的数。
(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;
解答:
这里void *是一种特殊的指针类型,可以存放任意对象的地址。所以这里p是合法的。
而,lp是一个长整型的指针,当要让其指向一个整型值的时候,编译器肯定会报错。