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,元素个数
}

 

posted @ 2022-11-16 00:44  7aughing  阅读(75)  评论(0编辑  收藏  举报