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

yizhihongxing

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日

相关文章

  • jQuery使用getJSON方法获取json数据完整示例

    下面是关于”jQuery使用getJSON方法获取json数据完整示例”的完整攻略: 1. 简介 在Web开发中,经常需要使用Ajax技术从服务器获取数据并进行显示或其他操作。其中,获取的数据可能是JSON格式的数据,应对这种需求,jQuery提供了一个getJSON()方法来处理JSON数据。 2. getJSON()方法说明 方法语法 $.getJSON…

    C 2023年5月23日
    00
  • 英语打字练习软件-c语言编写

    ​学习c语言的时候编写的英语打字练习软件,已经上传github 自取 https://github.com/grey-wood-wolf/typing-software   软件实际效果如下 在下载的压缩包里,运行exe文件就可使用,源码为ConsoleApplication1这个文件      部分代码如下: void welcom()//介绍 { int…

    C语言 2023年4月18日
    00
  • C语言 goto语句

    C语言 goto语句使用攻略 1. 简介 在C语言中,goto语句是一种控制跳转语句,用于直接跳转到指定的标识符位置。虽然使用goto语句会增加程序的复杂性和混乱性,但是在某些情况下能够提高程序运行效率或使程序更加简洁明了。下面将介绍goto语句的使用方法和注意事项。 2. 语法 goto语句的语法如下: goto 标识符; 其中,标识符是指被定义为标签的语…

    C 2023年5月9日
    00
  • C++ auto类型说明符

    C++自动类型说明符(auto)是一种C++11引入的新特性,可以让编译器自动推导出变量的数据类型。使用auto关键字可以帮助简化代码,减少代码冗余,提升阅读性和代码的可维护性。 auto类型说明符的使用方法 在C++11中,使用auto类型说明符定义变量时,可以这样写: auto 变量名 = 初始化表达式; 其中,变量名可以是任意合法的变量名,而初始化表达…

    C 2023年5月23日
    00
  • C语言指针使用问题-测试NULL

    当我们在 C 语言中使用指针时,需要注意指针的空指针问题。空指针是指指向内存中地址为 0 的指针,通常用 NULL 宏表示。当我们对空指针进行解引用操作时,程序会抛出异常,导致崩溃。因此在使用指针前,应该先判断指针是否为空。 使用指针前正确判断指针是否为空 通常情况下,我们在使用指针前应该先判断指针是否为空。可以使用 if 语句判断指针是否为空,例如: in…

    C 2023年5月9日
    00
  • Vue element ui用户展示页面的实例

    下面我将为你详细讲解“Vue element ui用户展示页面的实例”的完整攻略。 1. 环境配置 在开始使用Vue element ui之前,需要先进行环境配置。具体操作步骤如下: 安装Node.js:在Node.js官网下载对应系统的安装包,安装完成后,在命令行中输入node -v查看是否安装成功; 安装Vue CLI:在命令行中输入npm instal…

    C 2023年5月23日
    00
  • C++实现银行排队系统

    C++实现银行排队系统 介绍 银行排队系统是一种经典的模拟系统。该系统可以模拟银行中客户的流动、排队、服务等过程。通过模拟,可以帮助银行评估服务能力,从而提高工作效率。本文将介绍如何使用C++实现银行排队系统。 系统设计 队列的实现 队列是银行排队系统的核心数据结构。在C++中,可以使用STL中的队列容器来实现队列。以下是如何定义一个整型队列: “`c++…

    C 2023年5月23日
    00
  • c语言实现的货物管理系统实例代码(增加删除 查找货物信息等功能)

    一、简介 货物管理系统可以帮助企业更好地管理其货品,是一套非常实用的管理系统。本文将介绍使用c语言实现的一套货物管理系统,包括增加、删除、查找货物信息等功能。 二、实现步骤 设计数据结构 首先,我们需要设计合适的数据结构用于存储货物信息。可以使用结构体来定义货物信息,例如: struct goods { int id; char name[50]; int …

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