c++指针与引用、迭代器
注意空指针
指针的三种写法:
int *p; int * p; int* p;
堆和栈
栈:
- local variable 函数调用
- 变量的生命周期由scope决定
堆
- 在运行时分配内存
- 变量的生命周期由开发者决定,与scope无关
- new/delete
如何操作堆上的数据
C++delete一个指针之后为什么要设置为nullptr
// ---------------- 在栈上操作指针 int num{50}; int *pnum = # // 不建议 // (1)int *pnum; // 因为此处的pnum可以指向任何地方; // (2)pnum = # cout << num << " " << *pnum << endl; cout << &num << " " << pnum << endl; // ---------------- 在堆上操作指针 int *p1{nullptr}; p1 = new int; *p1 = 13; cout << *p1 << endl; delete p1; // ----- delete指针后,没有将指针置为nullptr ---- // 删除p1之后,没有将p1指向空,继续使用p1。程序没有崩溃。 // delete p1 实际上是删除了p1所指的目标,释放了其所占的对空间,而不是删除p1本身; // p1自己仍然存在,p1真正的释放是随着函数调用的结束而消失。 cout << *p1 << endl; // 正确写法 delete p1; p1 = nullptr;
指针的常见的错误
1. 指针所占的内存大小都是8字节(32位是4字节),那么指针是否可以指向不同的类型呢?
不可以
迭代器
vector<int>::iterator iter; //这条语句定义了一个名为iter的变量,它的数据类型是由vector<int>定义的iterator类型。 vector<int> ivec(5, 1); for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter) { *iter = 2; //使用 * 访问迭代器所指向的元素 } cout << ivec[0] << " " << ivec[3] << endl; // 2 2 // const_iterator 只能读取容器中的元素,而不能修改。 for (vector<int>::const_iterator citer = ivec.begin(); citer != ivec.end(); citer++){ cout << *citer; //*citer=3; //error } cout << endl; // iterator的算术操作 // iterator除了进行++,--操作,可以将iter+n,iter-n赋给一个新的iteraor对象。 // 还可以使用一个iterator减去另外一个iterator. const vector<int>::iterator newiter = ivec.begin(); vector<int>::iterator newiter2 = ivec.end(); cout << newiter2 - newiter << endl;; // 5,元素个数 }