在学习数组之前,我们先了解一下变量。
C++ 变量基础概念
变量是编程中用于存储数据的容器。在C++中,变量必须先声明后使用,声明时需要指定数据类型和变量名。变量名需遵循标识符命名规则:以字母或下划线开头,不能使用C++关键字,区分大小写。
int age = 25; // 整型变量
double price = 99.99; // 双精度浮点变量
char grade = 'A'; // 字符变量
bool isActive = true; // 布尔变量
变量命名规范
变量命名应具有描述性,通常采用驼峰命名法或下划线命名法。避免使用单个字母(循环计数器除外)或含义模糊的名称。
int studentCount; // 驼峰命名法
double average_score; // 下划线命名法
变量声明与初始化
C++支持多种初始化方式:传统赋值初始化、统一初始化(C++11引入)和直接初始化。未初始化的变量可能包含垃圾值。如果在主函数内定义,就会有这种问题。但是在主函数之前定义就是全局变量,初始值为零。
int x = 10; // 赋值初始化
int y{20}; // 统一初始化
int z(30); // 直接初始化
int w; // 未初始化(危险!)
基本数据类型
C++提供多种基本数据类型,每种类型占用不同内存空间并有特定取值范围:
- 整型:
short
,int
,long
,long long
- 浮点型:
float
,double
,long double
- 字符型:
char
,wchar_t
,char16_t
,char32_t
- 布尔型:
bool
short s = 32767; // 16位整数
unsigned int ui = 4294967295; // 无符号32位整数
float f = 3.14159f; // 单精度浮点
long double ld = 3.1415926535; // 扩展精度浮点
常量与const限定符
使用const
关键字创建不可修改的常量。C++11还引入了constexpr
用于编译时常量。
const double PI = 3.14159;
constexpr int MAX_SIZE = 100;
类型推断(auto)
C++11的auto
关键字允许编译器自动推断变量类型,简化代码编写。
auto name = "Alice"; // 推断为const char*
auto score = 95.5; // 推断为double
auto count = 10; // 推断为int
作用域与生命周期
变量根据声明位置具有不同作用域:
- 局部变量:函数或块内声明,仅在该范围内有效
- 全局变量:所有函数外声明,整个程序可见
- 静态变量:使用
static
关键字,生命周期贯穿程序运行
int globalVar = 100; // 全局变量
void func() {
int localVar = 50; // 局部变量
static int staticVar = 0; // 静态局部变量
}
类型转换
C++支持隐式和显式类型转换。显式转换更安全,推荐使用static_cast
。
int i = 42;
double d = i; // 隐式转换
int j = static_cast<int>(d); // 显式转换
变量使用注意事项
避免使用未初始化变量,注意数据类型的取值范围,合理选择变量作用域,对于大型数据考虑使用引用或指针。使用sizeof
运算符可以查看变量占用的内存大小。
int arr[10];
cout << sizeof(arr); // 输出40(假设int为4字节)
接下来,我们来了解一下数组。
数组的基本概念与定义
- 数组的定义与特性
- 一维数组与多维数组的区别
- 静态数组与动态数组的对比
数组的声明与初始化
- 一维数组的声明与初始化方式
int arr[5] = {1, 2, 3, 4, 5};
//在主函数中定义时,给出具体数值,否则会取非0值。
注意:数组下标从0开始。(int a[5]包含a[0],a[1],a[2],a[3],a[4],a[5])
- 多维数组的声明与初始化方式
int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
数组的常见操作
- 数组元素的访问与修改
arr[0] = 10; // 修改第一个元素
- 数组的遍历方法
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}
数组与指针的关系
- 数组名的指针特性
int* ptr = arr; // 数组名退化为指针
- 指针算术与数组访问的等价性
*(arr + 2) = 30; // 等价于 arr[2] = 30
动态数组的实现
- 使用
new
和delete
分配与释放动态数组
int* dynamicArr = new int[10];
delete[] dynamicArr;
std::vector
与动态数组的对比
vector<int> vec = {1, 2, 3, 4, 5};
数组在实际项目中的应用案例
- 数组在算法中的应用(如排序、搜索)
sort(arr, arr + 5); // 排序数组
- 数组在图形处理中的应用(如像素矩阵)
数组的优化与注意事项
- 内存局部性与缓存优化
- 数组越界访问的风险与防范
// 越界访问示例
int arr[3] = {1, 2, 3};
cout << arr[3]; // 未定义行为
高级数组技巧
- 数组与函数参数的传递方式
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
cout << arr[i] << " ";
}
}
- 数组与标准库的结合使用(如
<algorithm>
)
总结与扩展阅读
- 数组的优缺点总结
- 推荐进一步学习的数据结构(如链表、哈希表)