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;
}
📌 注意
- 数组大小 必须在编译时确定(C++原生数组不支持动态大小)。
- 数组索引从 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++字符串和结构体,敬请期待!🚀
💡 如果你喜欢这篇文章,欢迎点赞、收藏,并关注本系列!
3002

被折叠的 条评论
为什么被折叠?



