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

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
大数据开发治理平台 DataWorks,不限时长
实时计算 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++高手的关键一步。实践是检验真理的唯一标准,多动手编写代码,逐步加深理解,你将能更灵活、高效地运用这些基本构建块。

目录
相关文章
|
8天前
|
存储 安全 编译器
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
|
23天前
|
C++ 容器
【编程技巧】 C++11智能指针
C++11引入了智能指针以自动管理内存,防止内存泄漏和悬挂指针: - `shared_ptr`:引用计数,多所有权,适用于多个对象共享资源。 - `unique_ptr`:独占所有权,更轻量级,适用于单一对象所有者。 - `weak_ptr`:弱引用,不增加引用计数,解决`shared_ptr`循环引用问题。 ## shared_ptr - 支持引用计数,所有者共同负责资源释放。 - 创建方式:空指针、new操作、拷贝构造/移动构造,以及自定义删除器。 - 提供`operator*`和`operator-&gt;`,以及`reset`、`swap`等方法。 ## unique_ptr
228 1
|
23天前
|
编译器 C语言
指针进阶(数组指针 )(C语言)
指针进阶(数组指针 )(C语言)
|
7天前
|
安全 编译器 程序员
【C++11】智能指针
【C++11】智能指针
4 0
|
9天前
|
vr&ar C++
1695. 删除子数组的最大得分(C++,滑动窗口)
1695. 删除子数组的最大得分(C++,滑动窗口)
|
17天前
|
存储 C++ 索引
|
17天前
|
存储 安全 程序员
|
22天前
|
存储 C语言
C语言中的多级指针、指针数组与数组指针
C语言中的多级指针、指针数组与数组指针
13 0
|
22天前
|
存储 C语言
C语言数组指针详解与应用
C语言数组指针详解与应用
17 0

热门文章

最新文章