C++进阶篇1:数组的运用

在学习数组之前,我们先了解一下变量。

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
动态数组的实现
  • 使用newdelete分配与释放动态数组
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>
总结与扩展阅读
  • 数组的优缺点总结
  • 推荐进一步学习的数据结构(如链表、哈希表)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值