C语言数组是固定长度、同类型元素的连续内存存储结构,一旦定义长度不可修改,元素类型必须统一,索引从0开始,是C语言最基础的存储结构之一。
一、定义规则
格式为「数据类型 数组名[数组长度]」,长度必须是常量,不能用变量定义,例:int arr[5]、char str[10]、float sc[3]。
二、三种初始化方式
完全初始化:指定所有元素,未指定的位置不会留空,例:int arr1[5]={1,2,3,4,5};
部分初始化:未指定的元素自动赋值为0,例:int arr2[5]={1,2},剩余三个元素均为0;
省略长度:编译器根据初始化元素个数自动确定长度,例:int arr3[]={10,20,30},长度为3。
字符数组特殊初始化:用双引号初始化会自动加字符串结束标志’\0’,例:char str1[]=“hello”,长度为6;用大括号逐个初始化无’\0’,例:char str2[]={‘h’,‘e’,‘l’,‘l’,‘o’},长度为5。
三、元素访问与遍历
访问格式:数组名[索引],索引范围0到「长度-1」,例:arr[0]是第一个元素,arr[4]是长度为5的数组的最后一个元素,严禁越界访问,否则会读取垃圾内存导致程序异常;
计算长度技巧:用sizeof(数组名)/sizeof(数组名[0]),总字节数除以单个元素字节数,避免硬编码长度;
遍历方式:常用for循环按索引遍历,也可通过指针遍历,数组名本质是首元素地址,*(指针+i)等价于数组名[i]。
四、二维数组
二维数组的打印和输入
可理解为“数组的数组”,类似表格,有行和列,定义格式「数据类型 数组名[行数][列数]」,例:int arr[2][3]代表2行3列的二维数组;
初始化可按行大括号嵌套,也可直接按顺序初始化,未指定元素自动为0,例:int arr[2][3]={{1,2},{3}},剩余元素均为0;
访问格式「数组名[行索引][列索引]」,行和列索引均从0开始,遍历需双层for循环,外层遍历行,内层遍历列。
五、数组传参特点
C语言中数组传参不会传递整个数组,只会传递首元素的地址,形参写「数组名[]」或「指针」效果一致;
传参后在函数内用sizeof无法获取原数组总长度,需单独将数组长度作为参数传入函数。
六、核心注意事项
长度固定,定义后无法扩容或缩容;
索引从0开始,越界访问是常见错误,编译器不会报错但运行会出问题;
字符数组要区分是否有’\0’,无’\0’的字符数组不能用字符串处理函数(如strlen、printf(“%s”));
数组名是常量地址,不能直接赋值,例:arr={1,2,3}是错误写法,只能逐个修改元素。