C++的指针,引用和STL详解

C++的指针,引用和STL详解

指针

指针是C++语言中非常重要的一个概念,它是一个变量,其值为另一个变量的地址。指针的用途很广泛,它经常被用于动态的内存分配和数据结构中。

指针的定义和使用

指针的定义使用符号*,例如:

int *p;

这个语句定义了一个名为p的指向int类型的指针。指针变量必须初始化才能使用,一般有两种方式:

  1. 直接初始化赋值,例如:
int a = 10;
int *p = &a; //指向a的地址
  1. 动态分配内存,例如:
int *p = new int; //动态分配int类型的内存
*p = 10;  //给*p所指向的内存空间赋值为10

需要注意的是,动态分配的内存必须及时释放,否则会出现内存泄漏的情况,例如:

delete p;  //释放p所指向的内存空间
p = nullptr; //指针p的值设置为nullptr,防止出现野指针

指针的运算符

C++中有几个指针运算符需要掌握:

  1. *:取指针所指向的值,例如:
int a = 10;
int *p = &a;
cout << *p << endl; //输出a的值,即10
  1. &:取变量的地址,例如:
int a = 10;
int *p = &a;
cout << p << endl; //输出a的地址
  1. ++--:指针的前缀和后缀自增自减,例如:
int a[] = {1, 2, 3};
int *p = &a[0];
p++; //指向a[1]
cout << *p << endl; //输出2

引用

引用是C++中的另一个重要概念,它可以看作是变量的别名,引用的值会随着原变量的变化而变化。

引用和指针的区别

引用和指针具有相似的功能,但是也有区别:

  1. 引用不能为nullptr,指针可以为nullptr
  2. 引用在创建后不能指向其他变量,而指针可以指向其他变量;
  3. 引用必须在定义的时候就初始化,而指针可以后面再赋值。

引用的定义和使用

引用的定义使用符号&,例如:

int a = 10;
int &b = a;

b就是a的引用,b可以对a进行读写操作,例如:

b = 20; //修改b的值,a的值也会被修改
cout << a << endl; //输出20

引用的作用更多的是简化代码和提高效率,例如:

void swap(int &a, int &b) {
    int temp = a;
    a = b;
    b = temp;
}
//使用引用交换两个数的值
int x = 1, y = 2;
swap(x, y);
cout << x << " " << y << endl; //输出2 1

STL

STL(Standard Template Library)是C++的一个标准库,它实现了很多常用的数据结构和算法,包括向量、列表、队列、堆栈、映射、算法等等。下面以向量为例子,介绍STL的使用。

向量的定义和使用

向量是一种动态数组,它可以随意添加或删除其中的元素。向量的定义和使用需要包含头文件vector,例如:

#include <vector>
using namespace std;

vector<int> vec; //定义了一个空向量

向向量中添加元素使用push_back()方法,例如:

vec.push_back(1); //向向量中添加1

读取向量中的元素使用下标操作符[],例如:

cout << vec[0] << endl; //输出1

删除向量中的元素使用erase()方法,例如:

vec.erase(vec.begin()); //删除第一个元素

这只是向量的基础用法,STL中的其他数据结构和算法也如此,需要详细的学习和了解。

示例说明

示例1:使用指针和引用交换两个数字的值

void swap(int &a, int &b) {
    int temp = a;
    a = b;
    b = temp;
}

int main() {
    int x = 1, y = 2;
    int *p = &x;
    swap(x, y);
    cout << x << " " << y << endl; //输出2 1
    swap(*p, y);
    cout << x << " " << y << endl; //输出2 1
    return 0;
}

在这个示例中,我们定义了一个指针p和两个引用ab。通过指针可以修改变量的真实值,通过引用可以方便地进行数据交换。

示例2:使用STL实现快速排序算法

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int partition(vector<int> &arr, int begin, int end) {
    int pivot = arr[end]; //以最后一个元素为基准
    int left = begin - 1;
    for (int i = begin; i < end; i++) {
        if (arr[i] <= pivot) {
            left++;
            swap(arr[left], arr[i]);
        }
    }
    swap(arr[left+1], arr[end]);
    return left+1;
}

void quickSort(vector<int> &arr, int begin, int end) {
    if (begin < end) {
        int pivotIndex = partition(arr, begin, end);
        quickSort(arr, begin, pivotIndex - 1);
        quickSort(arr, pivotIndex + 1, end);
    }
}

int main() {
    vector<int> arr = {3, 6, 1, 7, 2, 8, 4, 5};
    quickSort(arr, 0, arr.size() - 1);
    for (int i = 0; i < arr.size(); i++) {
        cout << arr[i] << " ";
    }
    cout << endl;
    return 0;
}

在这个示例中,我们使用了STL中的向量和sort()算法来实现快速排序。由于向量可以随意添加或删除其中的元素,最终可以将算法的复杂度降低到$O(nlogn)$。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++的指针,引用和STL详解 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C语言实现图书馆管理系统

    C语言实现图书馆管理系统攻略 背景介绍 随着图书馆图书数量的不断增加,传统的人工管理方式已经越来越难以适应现代的需求,因此,采用计算机辅助手段实现图书馆管理是一个非常好的选择。下面我们将介绍如何使用C语言来实现一个图书馆管理系统。 系统功能 本系统主要包括以下功能: 图书信息的添加、删除、修改、查询 借书、还书功能 统计信息的查询 用户信息的添加、删除、修改…

    C 2023年5月23日
    00
  • C语言实现贪吃蛇超详细教程

    C语言实现贪吃蛇超详细教程 1. 简介 贪吃蛇是一款非常经典的游戏,同时其也是初学者学习编程的一个很好的练习项目,本教程将带领大家使用C语言来实现贪吃蛇。 2. 实现步骤 2.1 初始化 首先,我们需要初始化游戏窗口、贪吃蛇的位置、食物的位置以及其他一些必要的变量。 以Windows窗口为例,我们可以使用WinAPI来创建一个窗口,并使用CreateWind…

    C 2023年5月22日
    00
  • C语言中如何进行异步编程?

    异步编程一般指的是在程序中同时执行多个任务,而不是等待一个任务完成后再执行下一个任务。在 C 语言中,我们可以通过多线程或者事件驱动编程来实现异步编程。 多线程 多线程是一种利用 CPU 多核特性,同时执行多个线程的技术。C 语言中可以使用 pthread 库实现多线程编程。 首先需要导入 pthread 库头文件: #include <pthread…

    C 2023年4月27日
    00
  • C语言 解压华为固件的实例代码

    下面我将详细讲解“C语言 解压华为固件的实例代码”的完整攻略。 1. 前置要求 在开始之前,我们需要先安装好以下工具: make gcc git wget 使用如下命令安装: sudo apt-get update sudo apt-get install -y make gcc git wget 2. 获取华为固件压缩包 首先,我们需要从华为的官方网站上获…

    C 2023年5月24日
    00
  • Win7系统运行游戏应用程序报错0xc000007d无法正常启动

    问题描述: 在运行Win7系统中的某些游戏或应用程序时,出现了错误代码0xc000007d,导致无法正常启动。 解决方案: 确认系统与程序兼容性 首先,需要确认系统与待运行的游戏或应用程序之间的兼容性。Win7系统比较老旧,一些新的软件或应用需要更高版本的系统支持。可以查看软件或应用程序的官方网站,查看其支持的最低操作系统版本。如果程序不兼容,将无法运行。如…

    C 2023年5月24日
    00
  • 详解关于JSON.parse()和JSON.stringify()的性能小测试

    关于“详解关于JSON.parse()和JSON.stringify()的性能小测试”攻略,以下是完整的说明: 标题 1. 概述 在JavaScript中,JSON.parse()和JSON.stringify()是两个常用的方法,前者将JSON格式的字符串转换为JavaScript对象,后者则是将JavaScript对象转换为JSON格式的字符串。同时,在…

    C 2023年5月23日
    00
  • MFC程序执行过程深入剖析

    MFC程序执行过程深入剖析 前言 MFC(Microsoft Foundation Classes)是一组用于开发Windows界面应用程序的C++类库,开发人员可以使用MFC快速地开发Windows系统下的应用程序。然而,在实际开发中,掌握MFC程序的执行过程是极为重要的,本文深入分析了MFC程序的执行过程。 MFC程序执行过程 MFC程序的执行过程可以被…

    C 2023年5月30日
    00
  • C++中小数点输出格式(实例代码)

    我会为您详细讲解“C++中小数点输出格式(实例代码)”的完整攻略。 什么是小数点输出格式? 在C++中,浮点数的输出格式可以通过控制输出流的一些设置来实现。其中一个重要的设置就是小数点输出格式。在小数点输出格式中,我们可以控制输出的小数点的位置和小数点后面的位数。 如何控制小数点输出格式? C++中控制小数点输出格式的主要工具是iomanip库。我们可以使用…

    C 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部