第二章 2.3.2节练习

练习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是一个长整型的指针,当要让其指向一个整型值的时候,编译器肯定会报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值