当前位置: 首页 > news >正文

解锁C++:指针与数组、字符串的深度探秘

目录

一、指针与数组:亲密无间的伙伴

1.1 指针是数组的 “快捷通道”

1.2 数组名与指针:微妙的差别

1.3 动态数组:指针大显身手

二、指针与字符串:千丝万缕的联系

2.1 字符指针与 C 风格字符串

2.2 指针与 std::string 类

2.3 字符串常量与指针

三、指针在数组和字符串操作中的实际应用

3.1 字符串操作函数中的指针运用

3.2 数组排序:指针优化效率

3.3 复杂数据结构构建:指针串联数组与字符串

四、总结与展望


一、指针与数组:亲密无间的伙伴

        在 C++ 的编程世界里,指针与数组就像一对亲密无间的伙伴,它们之间的关系既紧密又微妙。理解它们之间的关系,是掌握 C++ 编程的关键。

1.1 指针是数组的 “快捷通道”

        在 C++ 中,指针可以被看作是访问数组元素的 “快捷通道”。从内存层面来看,数组在内存中是连续存储的,数组名实际上就是数组首元素的地址。这就意味着,我们可以通过指针来直接访问数组元素,而不需要通过数组下标来进行间接访问。这种方式不仅提高了访问效率,还为我们提供了更加灵活的操作方式。

        例如,我们有一个整型数组arr,可以定义一个指针p指向数组的首元素:

int arr[5] = {1, 2, 3, 4, 5};

int *p = arr;

        通过指针p,我们可以使用*p来访问数组的第一个元素,使用*(p + 1)来访问数组的第二个元素,以此类推。这种方式与使用数组下标arr[0]、arr[1]等效果是一样的,但在某些情况下,指针操作更加高效。比如,在遍历数组时,使用指针可以避免每次都进行数组下标的计算,从而提高程序的执行速度:

for (int i = 0; i < 5; i++) {

cout << *p << " ";

p++;

}

1.2 数组名与指针:微妙的差别

        虽然数组名和指针在很多情况下表现得极为相似,但它们之间还是存在一些微妙的差别。数组名本质上是一个常量指针,它指向数组的首元素,并且这个指针的值是固定不变的。这意味着我们不能对数组名进行赋值操作,也不能对其进行自增、自减等改变其值的操作。

例如,下面的代码是错误的:

int arr[5] = {1, 2, 3, 4, 5};

arr++; // 错误,数组名是常量,不能自增

int *p = arr;

p++; // 正确,指针是变量,可以自增

        另外,当我们使用sizeof运算符时,对数组名和指针的计算结果也不同。对数组名使用sizeof,得到的是整个数组占用的内存大小;而对指针使用sizeof,得到的是指针本身的大小(通常在 32 位系统上是 4 个字节,在 64 位系统上是 8 个字节)。

int arr[5] = {1, 2, 3, 4, 5};

int *p = arr;

cout << sizeof(arr) << endl; // 输出数组占用的内存大小,例如20(假设int占4个字节)

cout << sizeof(p) << endl; // 输出指针的大小,例如4或8

1.3 动态数组:指针大显身手

        在 C++ 编程中,我们常常需要根据实际需求动态地分配和释放内存,这时候指针就大显身手了。通过使用new和delete运算符,我们可以利用指针来创建和销毁动态数组。

        例如,下面的代码展示了如何使用指针动态分配一个包含 10 个整数的数组:

int *dynamicArray = new int[10];

        这里,new int[10]在堆内存中分配了一块连续的空间,用于存储 10 个整数,并返回指向这块空间首地址的指针,将其赋值给dynamicArray。在使用完动态数组后,我们必须使用delete[]来释放分配的内存,以避免内存泄漏:

delete[] dynamicArray;

        内存管理是 C++ 编程中的一个重要环节,如果我们忘记释放动态分配的内存,就会导致内存泄漏,这可能会使程序的性能逐渐下降,甚至导致程序崩溃。因此,在使用动态数组时,一定要养成及时释放内存的好习惯。

二、指针与字符串:千丝万缕的联系

        在 C++ 编程中,指针与字符串之间也有着千丝万缕的联系。无论是 C 风格的字符串,还是 C++ 标准库中的std::string类,指针都在其中扮演着重要的角色。

相关文章:

  • 【FC改版激龟快打】MUGEN 激龟快打-含下载地址、出招技能表
  • WSL2 Ubuntu安装Cuda 11.8
  • 蓝桥杯省赛真题C++B组-小球反弹
  • 利用Python爬虫根据关键词获取商品列表
  • 矫平机:工业制造的“误差归零者”,如何重塑智造新生态?
  • 深入理解 Qt 系统托盘图标:创建自定义的系统托盘图标类
  • 星越L_外后视镜使用讲解
  • Python的那些事第四十五篇:继承自Nose的测试框架Nose2
  • python中的max(),需要注意的点
  • 内存泄漏的防范:检测与预防
  • nodejs42 (UI相关) : svg的viewBox属性
  • 【小沐学Web3D】three.js 加载三维模型(React)
  • 【GNU Radio】ZMQ模块学习
  • 弹球小游戏-简单开发版
  • Spring Cloud 中的服务注册与发现: Eureka详解
  • python相关语法的学习文档1
  • @restcontroller和@RequestMapping 注解的简单学习
  • kmp报错→Cannot find skiko-windows-x64.dll.sha256
  • Java线程
  • MySQL知识点
  • 长三角多地重启游轮跨市游,“恢复苏杭夜航船”呼声又起
  • 刘诚宇、杨皓宇进球背后,是申花本土球员带着外援踢的无奈
  • 第四轮伊美核问题谈判预计5月11日举行
  • 外交部亚洲司司长刘劲松就日本民用飞机侵闯我钓鱼岛领空向日方提出严正交涉
  • 澳大利亚总理阿尔巴尼斯率领工党赢得2025年联邦选举
  • 5月1日,多位省级党委书记调研旅游市场、假期安全等情况