美文网首页
C++原始指针

C++原始指针

作者: VoyagerOne | 来源:发表于2018-06-02 17:19 被阅读491次

    最近在整理寝室的时候,发现一本大一的 C++ 笔记,现把里面觉得总结得还不错的知识分享出来。

    指针定义

    指针也是一个变量,只不过其存放的是内存地址,可以是另一个变量的地址或者一个函数的地址。
    当然因为是一个变量,所以指针也需要类型声明。

    指针声明

    在 C++ 中声明指针只需要在变量名前添加 * 符号,另外尽量在声明时进行初始化,不然指针将可能包含无用地址。

    int *ptr{nullptr} //  ptr被声明为空指针,没有指向
    

    获取地址

    既然指针存放地址,那么如何获取一个变量的地址呢,需要用到取地址操作 &

    int num{100};
    cout << num << endl; // 100
    cout << sizeof(num) << endl; // 4 // bytes
    cout << &num; // 0x7ffee73c5598
    

    & 可以获取变量在内存中的地址。

    访问指针

    既然已经获取地址,怎么获取这个内存地址中存放的值呢,需要用到 * 操作。

    int *p{nullptr};
    int num{100};
    p = &num;
    cout << p; // 0x7ffeebca25ac100
    cout << *p; // 100
    

    获得某变量的访问后,除了获取其值,还可以修改其值。

    int num{100};
    int *p{&num};
    cout << *p; // 100
    *p = 300;
    cout << *p; // 300
    cout << num; // 300
    

    数组指针

    由于数组是连续的存放在内存中,所以数组的地址是其第一个元素的内存地址。同样的,指向数组的指针,实际上是指向数组第一个元素的指针。

    int *p;
    int arr[]{1,2,3,4};
    p = arr;
    cout<<p<<endl; // 0x7ffeee9a65a0
    cout<<&arr<<endl; // 0x7ffeee9a65a0
    cout<<arr<<endl; // 0x7ffeee9a65a0
    cout<<*(p+1)<<endl; // 2 // 由于是连续存放,所以 `p+1` 是第二个元素的地址
    cout<<p[1]<<endl; // 2 
    

    vector 指针

    访问 vector 指针比访问原生数组要简单得多,仅仅需要将指针指向 vector 即可,但要注意在访问时,需要用 ( ) 将指正括起来,否则无法判断是访问 vector 还是访问一个指针数组的指向。

    vector<string> arr{"one", "two", "three"};
    vector<string> *ptr{&arr};
    cout << (*ptr)[0] << endl;
    

    动态内存分配

    在 C++ 中我们可以使用 new 关键字来动态分配内容,而 new 操作后返回的是分配内容的地址,所以我们需要用指针变量来赋值。

    int *ptr{nullptr};
    ptr = new int;
    *ptr = 300;
    cout << *ptr; // 300
    delete ptr;
    

    因为是手动分配的内存空间,所以不会被自动回收,需要手动释放空间,使用 delete 即可回收内容,防止内存泄露。

    也可以动态分配一组连续的内存空间,即数组。

    int *ptr{nullptr};
    int size{10};
    ptr = new int[size];
    ptr[0] = 90;
    ptr[4] = 20;
    cout << ptr[4]; // 20
    delete[]ptr;
    

    指针运算

    指针同其他变量一样是可以参与运算的。在比较运算中( ==, != ···),参与比较的是指针变量中存放的值,即地址,而非地址所指的值。在加减运算时,指针值的增减量是其类型所占内容大小的增减量:

    int *ptr{nullptr};
    int num{10};
    ptr = &num;
    cout << ptr << endl; // 0x7ffee10b2584
    cout << ptr + 1 << endl; // 0x7ffee10b2588
    cout << sizeof(int) << endl; // 4
    

    指针与 const

    const 在C++中表示常量,与指针有多重结合方式:

    int num = {200};
    int *const p{&num};
    *p = 0;  // OK
    ++p; // Error,常量指针,不能再重新赋值
    ------||------
    int num = {200};
    const int * p{&num};
    *p = 0; // Error, 只读指针
    ++p; // OK
    ------||------
    int num = {200};
    const int * const p{&num};
    *p = 0; // Error, 只读指针
    ++p; // Error, 常量指针,不能再重新赋值
    

    相关文章

      网友评论

          本文标题:C++原始指针

          本文链接:https://www.haomeiwen.com/subject/horrsftx.html