关闭

[C++学习] C++ Primer 第4版 习题4.18

340人阅读 评论(0) 收藏 举报

如有错误敬请指正.

 

这个习题需要注意以下几点:

 

1.指针的加减操作,在它指向一组元素(比如数组)的时候,是比较有意义的.

指针+n ,表示 移动 n个 元素类型大小 的内存单元.即 指向往后数第n个元素.

这里 n可以为 负数 ,表示指向往前数第n个元素.

 

2.pointer 和 array 的关系,和 iterator 和 vector 的关系非常类似,有许多相同的性质.

但是也有许多不同.

比如 iterator 一旦超过了vector 的 [begin(),end()]区间,运行时就会报错.

但 pointer 即使超过了 array 的范围,也不会出错,只有在超过范围利用这个超过范围的pointer取或设置数组的值得时候,

才会出错.

 

3.

两个指针相减的值是 ptrdiff_t 类型的数值,这种类型是 signed的,而不是 size_t类型( unsigned )的.

所以允许负数的出现.

比如

int arr[10];

int *p1 = &arr[3];

int *p2 = &arr[5];

p1-p2 的结果 就会是 -2,而不会是一个很大的 负数.

 

利用指针的加减法,可以更加灵活的操作指针.

比如

p1 += p2-p1 等同于  p1 = p2,无论 p1和 p2谁在前谁在后都成立.

 

4.

指针许多地方和iterator 接近,所以用指针遍历数组时,也可以参考iterator遍历vector.

 for(int *pbegin = arr,*pend = arr+arr_size;pbegin!=pend;++pbegin)

注意体会这个 for 循环 和 iterator 的相似之处.

 

#include<iostream>
#include<string>
#include<vector>
#include"GlobalDefine.h"
#include"GlobalDefine.h"
#include"Double.h"

using std::cin;
using std::cout;
using std::endl;
using std::vector;
using std::string;

int main()
{
	const size_t arr_size = 10;
	int arr[arr_size];

	for(int *pbegin = arr,*pend = arr+arr_size;pbegin!=pend;++pbegin)
	{
		*pbegin = 3;
	}

	return 0;
}


 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:182303次
    • 积分:3057
    • 等级:
    • 排名:第11458名
    • 原创:121篇
    • 转载:32篇
    • 译文:1篇
    • 评论:40条
    文章分类
    最新评论