手把手教你C++数组:初始化与遍历技巧

一、数组是什么?

在C++中,数组(Array)是一组相同类型元素的集合,这些元素在内存中连续存储。数组一旦定义,其大小就固定不变(静态数组),且每个元素通过索引(从0开始)访问。比如,一个存储5个整数的数组,索引范围是0到4,每个元素的类型都是int

二、数组的初始化方法

初始化数组就是给数组中的元素赋值。初学者常遇到的问题是“怎么正确给数组赋值?”,不同场景下初始化方式略有不同。

1. 基本类型数组(如int、double等)

(1)完全初始化(所有元素都赋值)

直接用大括号{}列出所有元素,元素数量与数组大小一致:

// 定义一个大小为5的int数组,并全部赋值
int arr[5] = {10, 20, 30, 40, 50};

// 注意:元素数量必须等于数组大小,否则会报错
// int arr[3] = {1,2,3,4}; // 错误!元素数量超过数组大小

(2)部分初始化(仅部分元素赋值)

如果只给部分元素赋值,未显式赋值的元素会被自动初始化为0(基本类型默认值):

// 定义大小为5的数组,仅前3个元素赋值,后2个自动为0
int arr[5] = {1, 2, 3}; 

// 此时arr的元素为:arr[0]=1, arr[1]=2, arr[2]=3, arr[3]=0, arr[4]=0

(3)省略数组大小,让编译器自动推导

如果明确知道元素数量,可省略数组大小,编译器会根据初始化元素数量自动确定数组大小:

int arr[] = {1, 2, 3, 4, 5}; // 编译器自动推导arr大小为5
cout << "数组大小:" << sizeof(arr)/sizeof(arr[0]) << endl; // 输出5

2. 字符数组(char)

字符数组用于存储字符,需注意字符串的特殊处理(以'\0'结尾)。

(1)用字符串字面量初始化(自动添加'\0'

直接用双引号""包裹字符串,会自动在末尾添加空字符'\0'(字符串结束标志):

char str1[] = "hello"; // 等价于 {'h','e','l','l','o','\0'}
// 注意:字符串长度为5(不含'\0'),数组大小为6(含'\0')

(2)逐个字符初始化(需手动处理'\0'

如果手动指定数组大小,需确保字符串以'\0'结尾,否则可能无法正确表示字符串:

char str2[6] = {'h', 'e', 'l', 'l', 'o', '\0'}; // 手动添加'\0'
char str3[5] = {'a', 'b', 'c'}; // 未加'\0',数组元素为{'a','b','c',0,0}(0是默认值)

三、数组的遍历技巧

遍历数组就是按顺序访问每个元素,常用循环实现。

1. 普通for循环(最常用,需已知数组大小)

通过索引i从0遍历到size-1(数组大小为n时,索引范围0~n-1):

int arr[] = {10, 20, 30, 40};
int n = sizeof(arr) / sizeof(arr[0]); // 计算数组大小(关键!)

// 遍历并打印每个元素
for (int i = 0; i < n; i++) {
    cout << "arr[" << i << "] = " << arr[i] << endl;
}

2. 范围for循环(C++11新增,无需索引)

for (auto element : arr)直接遍历所有元素,适合不需要修改索引的场景:

int arr[] = {1, 2, 3, 4, 5};
for (auto num : arr) { // auto自动推导元素类型(int)
    cout << num << " ";
}
cout << endl; // 输出:1 2 3 4 5 

注意:范围for循环无法获取索引(如需索引,仍用普通for),且修改element不会改变原数组(若需修改,需用引用:for (auto &num : arr))。

3. 遍历字符数组的特殊说明

字符数组可视为字符串,但需注意'\0'结尾符:

char str[] = "hello";
// 遍历字符串(用'\0'判断结束)
for (int i = 0; str[i] != '\0'; i++) { 
    cout << str[i]; // 输出:hello
}

四、注意事项

  1. 数组越界:索引必须在0n-1之间(n为数组大小),否则会访问到未知内存,导致程序崩溃或数据错误。
   int arr[3] = {1,2,3};
   arr[3]; // 越界!索引3超过数组大小(最大索引2),错误!
  1. 数组大小固定:定义后无法动态扩容,例如int arr[5]不能直接变成arr[6],需重新定义数组。

  2. 字符数组≠字符串:只有以'\0'结尾的字符数组才能用字符串函数(如strlen)处理,否则可能导致截断。

总结

数组是C++中存储同类型数据的基础结构,核心要点:
- 初始化:根据需求选择完全/部分初始化,字符数组注意'\0'结尾。
- 遍历:用普通for循环(需索引)或范围for循环(无需索引),避免越界。
- 关键操作:通过sizeof(arr)/sizeof(arr[0])获取数组大小,静态数组无法动态改变大小。

多练习不同初始化和遍历场景,就能熟练掌握数组的使用!

小夜