C++Primer第五版 2.3.2节练习
2015-09-10 22:38
239 查看
练习2.18:编写代码分别更改指针的值以及指针所指对象的值。
答案:见程序练习2.18
练习2.19:说明指针和引用的主要区别。
答:其实P49页就说得很好了。
指针引用都能提供对其他对象的间接访问。指针本身是一个对象,而引用本身并非一个对象。引用一旦绑定,就只能很那个绑定值同生共死,特别专一。每次使用这个引用都是访问它最初绑定的那个对象。
指针和它存放的地址之间就没有这种限制。和其他任何变量一样(引用的除外),给指针赋值就是令它存放一个新的地址,从而指向一个新的对象。
特别注意int *p = & i; 与std::cout<< *p << std::endl;中 符号*不是一回事,前一个与int 组成复合类型,后一个是解引用符,用来访问对象用的。
练习 2.20: 请叙述下面这段代码的作用。
int i = 42;
int*p1 = &i;
*p1= *p1 * *p1;
答:看着挺吓人,实际很好理解,*p1是间接访问i的,p1中存放的是i的地址,因此实际是通过指针p1间接修改了i的值,是i的值变成了42×42,验证程序为练习2.20.cpp
练习 2.21:请解释下述定义。在这些定义中有非法的吗?如果有,为什么?
intj = 0;
(a)double *dp = &j; (b)int *ip = j; (c)int *p = &j;
答:(a)非法,前后类型不一致
(b)非法,指针存放是一个对象的地址,而非对象本身
(c)合法
练习2.22:假设p是一个int型指针,请说明下述代码的含义
If(p) //.. //如果p存放的地址不为空,即p存放的地址存在,条件为真,向下执行
If(*p) //… //如果,p指向的int型对象的值不等于0,条件为真,向下执行。
练习2.23:给定指针p,你能知道它是否指向了一个合法的对象吗?如果能,叙述判断的思路;如果不能,也请说明原因。
答:应该不能判断指针p是否指向了一个合法的对象,因为如果指针p没有被初始化,p存放的是一个随机的地址,这是一件极其危险的事情,再者,如果p没有被合法的初始化,恶意存放了一个地址,也是危险的。所以,需要程序员自己清楚指针是否被合法使用。
练习2.24 在下面这段代码中为什么p合法而lp非法/
int i = 42; void *p = &i; long *lp =&I;
答:void *是一种特殊的指针类型,可以用于存放任意对象的地址。第三个两者类型不一,当然报错,和赋值不一样,指针要求两边类型严格一致(有特例,47页说其他章节会介绍)
练习2.18
答案:见程序练习2.18
练习2.19:说明指针和引用的主要区别。
答:其实P49页就说得很好了。
指针引用都能提供对其他对象的间接访问。指针本身是一个对象,而引用本身并非一个对象。引用一旦绑定,就只能很那个绑定值同生共死,特别专一。每次使用这个引用都是访问它最初绑定的那个对象。
指针和它存放的地址之间就没有这种限制。和其他任何变量一样(引用的除外),给指针赋值就是令它存放一个新的地址,从而指向一个新的对象。
特别注意int *p = & i; 与std::cout<< *p << std::endl;中 符号*不是一回事,前一个与int 组成复合类型,后一个是解引用符,用来访问对象用的。
练习 2.20: 请叙述下面这段代码的作用。
int i = 42;
int*p1 = &i;
*p1= *p1 * *p1;
答:看着挺吓人,实际很好理解,*p1是间接访问i的,p1中存放的是i的地址,因此实际是通过指针p1间接修改了i的值,是i的值变成了42×42,验证程序为练习2.20.cpp
练习 2.21:请解释下述定义。在这些定义中有非法的吗?如果有,为什么?
intj = 0;
(a)double *dp = &j; (b)int *ip = j; (c)int *p = &j;
答:(a)非法,前后类型不一致
(b)非法,指针存放是一个对象的地址,而非对象本身
(c)合法
练习2.22:假设p是一个int型指针,请说明下述代码的含义
If(p) //.. //如果p存放的地址不为空,即p存放的地址存在,条件为真,向下执行
If(*p) //… //如果,p指向的int型对象的值不等于0,条件为真,向下执行。
练习2.23:给定指针p,你能知道它是否指向了一个合法的对象吗?如果能,叙述判断的思路;如果不能,也请说明原因。
答:应该不能判断指针p是否指向了一个合法的对象,因为如果指针p没有被初始化,p存放的是一个随机的地址,这是一件极其危险的事情,再者,如果p没有被合法的初始化,恶意存放了一个地址,也是危险的。所以,需要程序员自己清楚指针是否被合法使用。
练习2.24 在下面这段代码中为什么p合法而lp非法/
int i = 42; void *p = &i; long *lp =&I;
答:void *是一种特殊的指针类型,可以用于存放任意对象的地址。第三个两者类型不一,当然报错,和赋值不一样,指针要求两边类型严格一致(有特例,47页说其他章节会介绍)
练习2.18
#include <iostream> using namespace std; int main() { int a = 5; int b = 10; cout << "a = " << a << " b = " << b << endl;//打印a b 值 int *p = &a; cout << "*p = " << *p << endl; //p指向a的地址 *p = *p + 1; cout << "a = " << a << endl; //相当于a的值增加1 p = &b; cout << "*p = " << *p <<endl; //此时p指向了b的地址 return 0; }
相关文章推荐
- C++学习之重载运算符1
- c++ using 关键字
- c++中字符数组与字符串的转换
- c++11可变参数模板
- C++的学习心得
- 玩儿转C语言:字符和字符串
- C++Primer第五版 2.3.1节练习
- 对C++中关联容器一些基础知识的认识
- C++ list函数详解
- C++Primer第五版 2.2.4节练习
- C++Primer第五版 2.2.3节练习
- 虚函数和纯虚函数
- C++Primer第五版 2.2.2节练习
- C++Primer第五版 2.2.1节练习
- C++内存对齐
- 常量指针、指针常量、C++类型转换
- C++用法的学习心得
- [置顶] C++强大背后
- C++Primer第五版 2.1.3节练习
- C++Primer第五版 2.1.2节练习