C++一分钟之-数组与指针基础

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时计算 Flink 版,5000CU*H 3个月
简介: 【6月更文挑战第19天】在C++中,数组和指针是核心概念,数组是连续内存存储相同类型的数据,而指针是存储内存地址的变量。数组名等同于指向其首元素的常量指针。常见问题包括数组越界、尝试改变固定大小数组、不正确的指针算术以及忘记释放动态内存。使用动态分配和智能指针可避免这些问题。示例代码展示了安全访问和管理内存的方法,强调了实践的重要性。

在C++编程的世界里,数组与指针是构建复杂数据结构和算法的基石。它们虽然在概念上有所区别,但在底层实现上却有着千丝万缕的联系。本文将带你深入浅出地理解数组与指针的基础,揭示它们之间的微妙关系,同时指出学习过程中常见的误区与易错点,并通过实例代码展示如何避免这些错误。
image.png

数组与指针:基础概念

数组

数组是一段连续的内存空间,用于存储相同类型的数据元素。声明一个数组时,需要指定元素类型和数组大小,如int arr[5];声明了一个可以存储5个整数的数组。

指针

指针是一个变量,其值为另一个变量的地址,即内存位置的直接指向。声明指针时需指定指针类型,如int *ptr;声明了一个指向整型变量的指针。

数组与指针的关系

在C++中,数组名实际上是一个常量指针,指向数组的第一个元素。这意味着,你可以使用指针来访问和操作数组元素。例如:

int arr[5] = {
   
   1, 2, 3, 4, 5};
int *ptr = arr; // ptr现在指向arr的第一个元素
cout << *ptr; // 输出1,因为*ptr相当于arr[0]

常见问题与易错点

1. 数组越界

问题描述:尝试访问数组边界之外的元素。 示例

int arr[7];
cout << arr[7]; // 错误,数组下标应该从0开始到6

避免方法:始终确保索引值在合法范围内,可以通过数组长度减一来计算最后一个元素的索引。

2. 修改数组大小

问题描述:试图在运行时改变数组的大小。 示例

int arr[5];
// 无法直接更改arr的大小,如arr = new int[10]; 是错误的

避免方法:使用动态分配的内存(如newdelete)或标准库容器(如std::vector)来实现动态大小调整。

3. 指针算术与数组访问

问题描述:不正确地使用指针进行数组访问。 示例

int arr[5] = {
   
   1, 2, 3, 4, 5};
int *ptr = arr;
cout << *(ptr + 6); // 错误,访问了数组之外的内存

避免方法:确保指针偏移量在合法范围内,即不超过数组的大小。

4. 指针释放

问题描述:忘记释放动态分配的内存。 示例

int *ptr = new int[5];
// 使用ptr...
// 忘记释放内存
// delete[] ptr; 应该在这里释放

避免方法:使用智能指针(如std::unique_ptrstd::shared_ptr)或确保每次new后都有对应的delete

实践代码示例

下面的代码展示了如何安全地使用指针访问数组,并通过智能指针管理动态内存:

#include <iostream>
#include <memory>

int main() {
   
   
    // 静态数组示例
    int arr[5] = {
   
   1, 2, 3, 4, 5};
    int *ptr = arr;
    for(int i = 0; i < 5; ++i) {
   
   
        std::cout << ptr[i] << " "; // 安全访问数组元素
    }
    std::cout << std::endl;

    // 动态数组与智能指针示例
    std::unique_ptr<int[]> dynamicArr(new int[5]);
    for(int i = 0; i < 5; ++i) {
   
   
        dynamicArr[i] = i + 1;
    }
    for(int i = 0; i < 5; ++i) {
   
   
        std::cout << dynamicArr[i] << " ";
    }
    std::cout << std::endl;
    // 不需要手动释放,智能指针自动管理

    return 0;
}

通过以上内容,我们不仅复习了数组与指针的基础知识,还探讨了在实际编程中可能遇到的问题及解决策略。记住,熟练掌握数组与指针是成为C++高手的关键一步。实践是检验真理的唯一标准,多动手编写代码,逐步加深理解,你将能更灵活、高效地运用这些基本构建块。

目录
相关文章
|
2天前
|
搜索推荐 编译器 C语言
【C++核心】特殊的元素集合-数组与字符串详解
这篇文章详细讲解了C++中数组和字符串的基本概念、操作和应用,包括一维数组、二维数组的定义和使用,以及C风格字符串和C++字符串类的对比。
18 4
|
2天前
|
编译器 C++
【C++核心】指针和引用案例详解
这篇文章详细讲解了C++中指针和引用的概念、使用场景和操作技巧,包括指针的定义、指针与数组、指针与函数的关系,以及引用的基本使用、注意事项和作为函数参数和返回值的用法。
11 3
|
23天前
|
C++
C++(十一)对象数组
本文介绍了C++中对象数组的使用方法及其注意事项。通过示例展示了如何定义和初始化对象数组,并解释了栈对象数组与堆对象数组在初始化时的区别。重点强调了构造器设计时应考虑无参构造器的重要性,以及在需要进一步初始化的情况下采用二段式初始化策略的应用场景。
|
23天前
|
C++
C++(十八)Smart Pointer 智能指针简介
智能指针是C++中用于管理动态分配内存的一种机制,通过自动释放不再使用的内存来防止内存泄漏。`auto_ptr`是早期的一种实现,但已被`shared_ptr`和`weak_ptr`取代。这些智能指针基于RAII(Resource Acquisition Is Initialization)原则,即资源获取即初始化。RAII确保对象在其生命周期结束时自动释放资源。通过重载`*`和`-&gt;`运算符,可以方便地访问和操作智能指针所指向的对象。
|
23天前
|
C++
C++(九)this指针
`this`指针是系统在创建对象时默认生成的,用于指向当前对象,便于使用。其特性包括:指向当前对象,适用于所有成员函数但不适用于初始化列表;作为隐含参数传递,不影响对象大小;类型为`ClassName* const`,指向不可变。`this`的作用在于避免参数与成员变量重名,并支持多重串联调用。例如,在`Stu`类中,通过`this-&gt;name`和`this-&gt;age`明确区分局部变量与成员变量,同时支持链式调用如`s.growUp().growUp()`。
|
1月前
|
搜索推荐 C语言
指针与数组
指针与数组
50 9
|
1月前
|
存储 安全 C++
C++:指针引用普通变量适用场景
指针和引用都是C++提供的强大工具,它们在不同的场景下发挥着不可或缺的作用。了解两者的特点及适用场景,可以帮助开发者编写出更加高效、可读性更强的代码。在实际开发中,合理选择使用指针或引用是提高编程技巧的关键。
24 1
|
1月前
|
算法 C++
c++学习笔记04 数组
这篇文章是C++学习笔记4,主题是数组。
37 4
|
1月前
|
安全 NoSQL Redis
C++新特性-智能指针
C++新特性-智能指针
|
30天前
|
C++ 索引
C++数组、vector求最大值最小值及其下标
C++数组、vector求最大值最小值及其下标
52 0