C++语法复习笔记-1. c++指针
创始人
2024-05-15 16:43:02
0

文章目录

  • 1. 计算机内存
    • 1. 储存层次
    • 2. 内存单元与地址
    • 3. 指针定义
  • 2. 左值与右值
    • 1. 数组与指针
    • 1. 概念
  • 3. C++中的原始指针
    • 1. 数组指针与指针数组
    • 2. const pointer 与 pointer to const
    • 3. 指向指针的指针
    • 4.关于野指针
      • 4.1 指向指针的指针
      • 4.2 NULL指针
      • 4.3 野指针
    • 5. 指针的基本运算
      • 5.1 & 操作
      • 5.2 *操作
      • 5.3 ++和--操作
      • 5.4 ++++与----运算符
    • 6. 内存分配
      • 6.1 总览
      • 6.2 heap堆
      • 6.3 分配和回收动态内存的原则
      • 6.4 资源管理方案--RAII
      • 6.5 c++中几种变量的对比
      • 6.6 内存泄漏问题
  • 4 更安全方式使用指针
    • 1. 智能指针
      • auto_ptr
      • unique_ptr
      • shared_ptr
      • weak_ptr
    • 2. 引用
      • 为何使用引用
      • 引用的使用
      • 函数传递总结

慕课网C++课程

1. 计算机内存

1. 储存层次

在这里插入图片描述

2. 内存单元与地址

在这里插入图片描述
在这里插入图片描述

3. 指针定义

在这里插入图片描述
在这里插入图片描述

2. 左值与右值

1. 数组与指针

在这里插入图片描述

1. 概念

在这里插入图片描述

3. C++中的原始指针

1. 数组指针与指针数组

在这里插入图片描述
在这里插入图片描述

2. const pointer 与 pointer to const

在这里插入图片描述

  • 测试

在这里插入图片描述

  • 数组只是指向了一块字符空间,没有自己真实的地址
    在这里插入图片描述
  • pStr1指向了数组指向的字符的地址,编译器做了优化

在这里插入图片描述

  • pStr2-指针变量本身的地址,为字符数组地址
    在这里插入图片描述
  • pStr3地址指向的字符串内容不能有任何改变
    在这里插入图片描述
  • pStr2指针的内容可以改变,但是与pStr1指针指向的内存一致,因此,虽然pStr1只读,但pStr2改变后,pStr1指向内容还是发生了改变
    在这里插入图片描述

3. 指向指针的指针

在这里插入图片描述

4.关于野指针

4.1 指向指针的指针

在这里插入图片描述
在这里插入图片描述

4.2 NULL指针

在这里插入图片描述
在这里插入图片描述

4.3 野指针

在这里插入图片描述

5. 指针的基本运算

5.1 & 操作

  • 取地址的值,只能做右值,取到地址后,作为一个空间变量,可以赋给一个指针,
  • 但是取特定空间的地址操作不能做左值,即,不能通过取地址操作改变地址
    在这里插入图片描述

5.2 *操作

  • 右值,是取指针指向地址空间上的对象值
  • 左值,是取指针指向的地址空间,可以对地址进行操作
    在这里插入图片描述
    在这里插入图片描述

5.3 ++和–操作

在这里插入图片描述
在这里插入图片描述

  • 不能作为左值,只是一个中间的副本,没有明确的地址
    在这里插入图片描述
    在这里插入图片描述

5.4 ++++与----运算符

在这里插入图片描述

6. 内存分配

6.1 总览

在这里插入图片描述
在这里插入图片描述

6.2 heap堆

在这里插入图片描述

6.3 分配和回收动态内存的原则

在这里插入图片描述

6.4 资源管理方案–RAII

在这里插入图片描述

6.5 c++中几种变量的对比

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.6 内存泄漏问题

在这里插入图片描述

4 更安全方式使用指针

在这里插入图片描述
在这里插入图片描述

1. 智能指针

auto_ptr

在这里插入图片描述

  • new的对象出了作用域,会自动删除
  • 指针设置为空,用nullptr,NULL是c语言语法,有二意,建议用nullptr对指针设空
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

unique_ptr

在这里插入图片描述

#include "stdafx.h"#include    // 智能指针
#include 
using namespace std;
int main()
{// 在这个范围之外,unique_ptr被释放{auto i = unique_ptr(new int(10));cout << *i << endl;}// unique_ptrauto w = std::make_unique(10);cout << *(w.get()) << endl;      // 10//auto w2 = w; // 编译错误如果想要把 w 复制给 w2, 是不可以的。//  因为复制从语义上来说,两个对象将共享同一块内存。// unique_ptr 只支持移动语义, 即如下auto w2 = std::move(w); // w2 获得内存所有权,w 此时等于 nullptrcout << ((w.get() != nullptr) ? (*w.get()) : -1) << endl;       // -1cout << ((w2.get() != nullptr) ? (*w2.get()) : -1) << endl;   // 10return 0;
}

在这里插入图片描述

shared_ptr

  • 需要一个引用计数的信号量控制

在这里插入图片描述
在这里插入图片描述

weak_ptr

  • 解决循环引用的问题
    在这里插入图片描述
  • 用法示例
  • shared_ptr 内部是利用引用计数来实现内存的自动管理,
  • 每当复制一个 shared_ptr,引用计数会 + 1。当一个 shared_ptr 离开作用域时,引用计数会 - 1。
  • 当引用计数为 0 的时候,则 delete 内存。
// shared_ptr {//shared_ptr 代表的是共享所有权,即多个 shared_ptr 可以共享同一块内存。auto wA = shared_ptr(new int(20));{auto wA2 = wA;cout << ((wA2.get() != nullptr) ? (*wA2.get()) : -1) << endl;    // 20cout << ((wA.get() != nullptr) ? (*wA.get()) : -1) << endl;      // 20cout << wA2.use_count() << endl; // 引用计数 :2cout << wA.use_count() << endl;                                  // 2} // WA2出了作用域,消亡//cout << wA2.use_count() << endl;                                               cout << wA.use_count() << endl;                                      // 1cout << ((wA.get() != nullptr) ? (*wA.get()) : -1) << endl;          // 20}
  • move语法的使用
// move 语法//将 wAA 对象 move 给 wAA2,意味着 wAA 放弃了对内存的所有权和管理,此时 wAA对象等于 nullptr。//而 wAA2 获得了对象所有权,但因为此时 wAA 已不再持有对象,因此 wAA2 的引用计数为 1。auto wAA = std::make_shared(30);auto wAA2 = std::move(wAA); // 此时 wAA 等于 nullptr,wAA2.use_count() 等于 1cout << ((wAA.get() != nullptr) ? (*wAA.get()) : -1) << endl;        // -1cout << ((wAA2.get() != nullptr) ? (*wAA2.get()) : -1) << endl;      // 30cout << wAA.use_count() << endl;                                     // 0cout << wAA2.use_count() << endl;   
  • 循环引用问题
// demo5-11.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"#include 
#include 
#include 
using namespace std;// 具有shared_ptr指针的两个结构体
struct B;
struct A {shared_ptr pb;~A(){cout << "~A()" << endl;}
};
struct B {shared_ptr pa;~B(){cout << "~B()" << endl;}
};// 具有shared_ptr和weak_ptr指针的两个结构体
struct BW;
struct AW
{shared_ptr pb;~AW(){cout << "~AW()" << endl;}
};
struct BW
{weak_ptr pa;~BW(){cout << "~BW()" << endl;}
};// pa 和 pb 存在着循环引用,根据 shared_ptr 引用计数的原理,pa 和 pb 都无法被正常的释放。
// weak_ptr 是为了解决 shared_ptr 双向引用的问题。
void Test()
{cout << "Test shared_ptr and shared_ptr:  " << endl;shared_ptr tA(new A());       // 1shared_ptr tB(new B());       // 1cout << tA.use_count() << endl;cout << tB.use_count() << endl;tA->pb = tB;tB->pa = tA;cout << tA.use_count() << endl;  // 2cout << tB.use_count() << endl;  // 2
}
void Test2()
{cout << "Test weak_ptr and shared_ptr:  " << endl;shared_ptr tA(new AW());shared_ptr tB(new BW());cout << tA.use_count() << endl;   // 1cout << tB.use_count() << endl;   // 1tA->pb = tB;tB->pa = tA;cout << tA.use_count() << endl;   // 1,weak_ptr指向tA,不会对tA的引用计数产生影响cout << tB.use_count() << endl;   // 2
} // 当作用域结束后,Aw计数只有1,减一为0后,会正常释放,Aw消亡后,对BW的影响也消除int main()
{Test();Test2();return 0;
}

在这里插入图片描述

2. 引用

为何使用引用

在这里插入图片描述
在这里插入图片描述

引用的使用

在这里插入图片描述

  • 测试
// demo5-12.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"#include 
#include 
using namespace std;// 编写一个函数,输入两个int型变量a,b
// 实现在函数内部将a,b的值进行交换。
void swap(int& a, int& b)
{int tmp = a;a = b;b = tmp;
}
void swap2(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}int main()
{// 交换变量的测试int a = 3, b = 4;swap(a, b);assert(a == 4 && b == 3);a = 3, b = 4;swap2(&a, &b); // 用指针变量,需要传地址assert(a == 4 && b == 3);return 0;
}

函数传递总结

在这里插入图片描述

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...