C++学习系列(4):C++数组与指针

C++学习系列(4):C++数组与指针

1. 前言

在前几篇文章中,我们已经学习了 C++的基本语法、控制流、函数与作用域,本篇文章将重点讲解 数组(Array)和指针(Pointer),包括:

  • 数组的基本概念
  • 指针的基本概念
  • 指针与数组的关系
  • 指针运算
  • 动态内存管理(new/delete)

理解指针是学习 C++ 的关键,掌握指针后可以更深入理解 内存管理数据结构。📌


2. C++数组(Array)

2.1 数组的定义

数组是一组相同类型的变量的集合,通常用于存储多个数据,如:

#include <iostream>

int main() {
    int numbers[5] = {1, 2, 3, 4, 5};  // 定义一个整数数组
    std::cout << "numbers[0] = " << numbers[0] << std::endl;
    return 0;
}

📌 注意

  1. 数组大小 必须在编译时确定(C++原生数组不支持动态大小)。
  2. 数组索引从 0 开始numbers[0] 代表第一个元素。

2.2 遍历数组

使用 for 循环遍历数组:

#include <iostream>

int main() {
    int arr[] = {10, 20, 30, 40, 50};  // 定义数组
    int size = sizeof(arr) / sizeof(arr[0]);  // 计算数组大小

    for (int i = 0; i < size; i++) {
        std::cout << "arr[" << i << "] = " << arr[i] << std::endl;
    }

    return 0;
}

📌 数组大小计算公式

数组大小 = 数组总字节数 / 单个元素字节数

3. C++指针(Pointer)

3.1 指针的基本概念

指针是存储变量地址的变量:

#include <iostream>

int main() {
    int a = 10;
    int* p = &a;  // 指针 p 存储 a 的地址

    std::cout << "a 的值: " << a << std::endl;
    std::cout << "a 的地址: " << &a << std::endl;
    std::cout << "p 存储的地址: " << p << std::endl;
    std::cout << "p 指向的值: " << *p << std::endl;

    return 0;
}

📌 指针的作用

  • 访问和操作内存
  • 传递大数据(避免值传递的性能损耗)
  • 动态内存分配

3.2 指针与数组

数组名本质上是一个指向首元素的指针

#include <iostream>

int main() {
    int arr[] = {10, 20, 30, 40, 50};
    int* p = arr;  // p 指向数组首地址

    std::cout << "arr[0] = " << *p << std::endl;  // 通过指针访问数组元素

    p++;  // 指针移动到下一个元素
    std::cout << "arr[1] = " << *p << std::endl;

    return 0;
}

📌 数组和指针的关系

  • arr 等价于 &arr[0]
  • arr[i] 等价于 *(arr + i)

3.3 指针运算

指针支持加减运算

#include <iostream>

int main() {
    int arr[] = {100, 200, 300};
    int* p = arr;  // 指向首元素

    std::cout << "p = " << *p << std::endl;
    std::cout << "p+1 = " << *(p+1) << std::endl;
    std::cout << "p+2 = " << *(p+2) << std::endl;

    return 0;
}

📌 规则

  • p + 1 使指针移动到 下一个元素
  • p - 1 使指针移动到 前一个元素

4. 动态内存管理

4.1 new 和 delete

new 用于动态分配内存,delete 释放内存:

#include <iostream>

int main() {
    int* p = new int(10);  // 分配一个 int 内存
    std::cout << "p 指向的值: " << *p << std::endl;

    delete p;  // 释放内存
    return 0;
}

📌 注意

  • 动态分配的内存 需要手动释放,否则会造成 内存泄漏

4.2 动态数组

动态分配数组:

#include <iostream>

int main() {
    int* arr = new int[5];  // 分配数组

    for (int i = 0; i < 5; i++) {
        arr[i] = i * 10;
    }

    for (int i = 0; i < 5; i++) {
        std::cout << "arr[" << i << "] = " << arr[i] << std::endl;
    }

    delete[] arr;  // 释放数组
    return 0;
}

📌 new[]delete[]

  • new[] 用于 动态分配数组
  • delete[] 释放 动态数组

5. 指针与常量

5.1 指针常量

指针的 地址不可变

int a = 10, b = 20;
int* const p = &a;  // p 是指针常量

p = &b;  // ❌ 错误,p 的地址不可变
*p = 30;  // ✅ 正确,p 指向的值可以修改

5.2 常量指针

指针 指向的值不可变

const int* p = &a;  // p 是常量指针

p = &b;  // ✅ 正确,p 可以指向其他变量
*p = 30;  // ❌ 错误,不能修改 p 指向的值

6. 小结与展望

在本篇博客中,我们学习了:
数组的定义与遍历
指针的基本概念
指针与数组的关系
指针运算
动态内存管理

🎯 指针是 C++ 高级编程的重要基础,理解指针有助于学习 数据结构、STL、智能指针 等高级特性。

在下一篇 C++学习系列(5) 中,我们将深入学习 C++字符串和结构体,敬请期待!🚀


💡 如果你喜欢这篇文章,欢迎点赞、收藏,并关注本系列!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值