指针操作
在<<c++ primer>> 第四版Exercise Section 4.3.1 练习题中的Exercise 4.28 题,如下:
编写程序由标准输入的元素数据建立一个int 型的vector 对象,然后动态创建一个与该vector 对象大小一致的数组,把vector 中的元素全部都复制到新数组。代码示例如下:
1 // 2_3.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include <iostream> 6 #include <string> 7 #include <vector> 8 9 using namespace std; 10 11 int main() 12 { 13 14 vector<int> vect; 15 int num; 16 while (cin >> num) 17 { 18 if (num == 0) 19 { 20 break; 21 } 22 vect.push_back(num); 23 } 24 int *ptr = new int[vect.size()]; 25 int i = 0; 26 for (vector<int>::iterator begin = vect.begin(); begin != vect.end(); ++begin, ++ptr) 27 { 28 *ptr = *begin; 29 } 30 31 ptr = ptr - vect.size(); 32 33 for (size_t i = 0; i < vect.size(); i++) 34 { 35 cout << *(ptr + i) << endl; 36 } 37 38 delete[] ptr; 39 return 0; 40 }
测试环境本机windows 10,vs2015.这里有一点要说明,
第26-29 行是遍历vector 对象并将该对象中的数值全部都通过数组指针的解引用放到数组中来。
第33-36 行是遍历数组,通过数组指针的解引用来取值,将值全部打印出来。
特别要说明的是,第31行代码非常重要,因此在26行的循环跑完以后,数组指针已经指导数组最后的位置了,如果31行不把数组指针退回到起点位置,那么会导致33行的循环出现数组越界的错误。导致程序报错。测试了很久才发现这个问题,特别记录一下。