一维数组的创建、初始化与使用指南
目录
一、数组的概念
二、一维数组的创建和初始化
1、数组创建
说明:
示例:
2、数组初始化
注意事项:
3、数组的类型
三、一维数组的使用
1、数组下标
2、数组元素的打印
3、数组的输入
4、补充注意事项
四、数组在内存中的存储及元素个数计算
1、一维数组在内存中的存储
重要结论:
2、使用sizeof计算数组元素个数
sizeof运算符简介
示例:
计算数组元素个数
实现代码:
优点:
一、数组的概念
数组是编程中一种基本且重要的数据结构,它是一组相同类型元素的集合。这个概念包含两个关键点:
-
元素数量:数组可以存放一个或多个数据元素,但元素个数不能为零(即数组不能为空)
-
元素类型:数组中所有元素必须具有相同的数据类型
数组可以分为:
-
一维数组:最简单的数组形式,元素线性排列
-
多维数组:常见的是二维数组(如矩阵),理论上可以有任意维度
二、一维数组的创建和初始化
1、数组创建
一维数组创建的基本语法:
type arr_name[常量值];
说明:
-
type
:指定数组元素的数据类型,可以是基本类型(char
,short
,int
,float
等)或自定义类型 -
arr_name
:数组名称,应遵循标识符命名规则并具有描述性 -
[常量值]
:定义数组大小,必须是编译时的常量
示例:
int math[20]; // 存储20个学生的数学成绩
char ch[8]; // 存储8个字符
double score[10]; // 存储10个双精度浮点数
2、数组初始化
数组初始化是指在创建数组时为其元素赋初值,使用大括号{}
包围初始值:
// 完全初始化
int arr[5] = {1, 2, 3, 4, 5};// 不完全初始化 - 剩余元素自动初始化为0
int arr2[6] = {1}; // 错误初始化 - 初始值过多
int arr3[3] = {1, 2, 3, 4}; // 编译错误
注意事项:
-
当初始值少于数组大小时,剩余元素自动初始化为0
-
初始值数量不能超过数组大小
-
C99标准支持指定初始化器(designated initializers):
int arr[10] = {[3]=5, [7]=9}
3、数组的类型
数组本身也是一种类型,其类型由元素类型和数组大小共同决定。去掉数组名后剩下的部分就是数组类型:
int arr1[10]; // 类型为 int [10]
int arr2[12]; // 类型为 int [12]
char ch[5]; // 类型为 char [5]
在C语言中,数组不是自定义类型(user-defined type),而是派生类型(derived type),它是由基本类型(如int
、char
等)或自定义类型(如结构体)构造而成的复合数据类型。
注意:int [10]
和int [12]
是两种不同的数组类型。
三、一维数组的使用
1、数组下标
C语言数组特性:
-
下标从0开始
-
最后一个元素的下标是
n-1
(n为数组大小) -
使用
[]
操作符访问元素(称为下标引用操作符)
示例:
int arr[10] = {1,2,3,4,5,6,7,8,9,10};printf("%d\n", arr[0]); // 访问第一个元素,输出1
printf("%d\n", arr[7]); // 访问第8个元素,输出8
2、数组元素的打印
要遍历整个数组,通常使用for循环配合下标访问:
#include <stdio.h>int main() {int arr[10] = {1,2,3,4,5,6,7,8,9,10};for(int i = 0; i < 10; i++) {printf("%d ", arr[i]);}return 0;
}
3、数组的输入
可以通过循环为数组元素赋值:
#include <stdio.h>int main() {int arr[10];// 输入数组元素printf("请输入10个整数:\n");for(int i = 0; i < 10; i++) {scanf("%d", &arr[i]);}// 输出数组元素printf("数组内容为:");for(int i = 0; i < 10; i++) {printf("%d ", arr[i]);}return 0;
}
4、补充注意事项
-
数组越界访问:C语言不检查数组边界,访问
arr[-1]
或arr[10]
(对于大小为10的数组)会导致未定义行为 -
数组大小计算:可以使用
sizeof
运算符获取数组总字节数:sizeof(arr)
-
元素个数计算:
sizeof(arr) / sizeof(arr[0])
-
变长数组:C99支持变长数组(VLA),但大小一旦确定就不能改变
int n = 10;
int vla[n]; // 变长数组,大小由变量n决定
四、数组在内存中的存储及元素个数计算
1、一维数组在内存中的存储
通过前面的学习,我们已经能够熟练使用数组了。为了更深入地理解数组,我们需要了解数组在内存中的存储方式。
让我们通过以下代码来观察数组元素的地址分布:
#include <stdio.h>int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,10};int i = 0;for(i=0; i<10; i++){printf("&arr[%d] = %p\n", i, &arr[i]);}return 0;
}
运行这段代码后,我们会发现:
-
随着数组下标的增加,元素的地址呈现由小到大的变化规律
-
每两个相邻元素之间的地址差值为4(因为一个整型占4个字节)
x64 表示是64位的环境,在64位的环境中地址是64bit位的,所以就比较长;我们可以切换到x86,也就是32位环境,地址会短一点,容易观察,如上图。
重要结论:
数组在内存中是连续存储的。这一特性为后续使用指针访问数组元素奠定了基础(指针相关内容将在后续章节详细讲解)。
2、使用sizeof计算数组元素个数
在实际编程中,我们经常需要知道数组的元素个数。C语言提供了使用sizeof
运算符来计算数组元素个数的方法。
sizeof运算符简介
sizeof
是C语言中的一个关键字,用于计算类型或变量所占内存空间的大小(以字节为单位)。对于数组,sizeof
可以计算整个数组所占的内存空间大小。我们知道数组中的所有元素类型相同,因此只需计算单个元素的字节大小,就能确定数组的元素个数。这里直接以第一个元素的大小作为基准即可。
示例:
#include <stdio.h>int main()
{int arr[10] = {0};printf("%d\n", sizeof(arr)); // 输出整个数组的大小//上面这句会输出40,因为数组包含10个int类型元素,每个int占4字节,总共是40字节。printf("%d\n", sizeof(arr[0]));//计算⼀个元素的⼤⼩,单位是字节return 0;
}
计算数组元素个数
由于数组中所有元素的类型相同,我们可以通过以下公式计算数组元素个数:数组元素个数 = 数组总大小 / 单个元素大小
实现代码:
#include <stdio.h>int main()
{int arr[10] = {0};int sz = sizeof(arr) / sizeof(arr[0]); // 计算元素个数printf("%d\n", sz); // 输出10return 0;
}
优点:
这种方法使得代码更加灵活,当数组大小改变时,不需要手动修改所有相关代码,计算结果会自动适应数组的变化。