数组(C语言)
数组:一组具有相同类型数据的集合。
1、 一维数组的创建
一维数组的定义方式:type_t arr_name[ count ];
//type_t 数组元素的类型
//arr_name 数组名
//count 数组元素的个数,是一个常量表达式
eg: int arr1[10];
float arr2[20];
double arr3[30];
注意:(1)、数组名的命名规则和变量名的命名规则相同;
(2)、[ ] 中必须是常量,不可以是变量
eg:int count = 10;
int arr4[count]; //在这里,count为整型变量,故数组创建失败。
2、一维数组的初始化
初始化方式:
(1)、定义数组时对数组全部元素赋予初值;
eg: int arr1[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
(2)、定义数组时只对一部分元素赋予初值;
eg: int arr2[10] = { 0, 1, 2, 3 }; //数组有10个元素,前四个元素赋予了初值,其余元素值为 0
(3)、若初始数组元素都为 0
eg: int arr3[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
int arr4[10] = { 0 }; //以上两种均可实现,但一般情况下,我们会使用后一个定义方式。
(4)、对全部元素赋予初值,可不定义数组大小
eg: int arr5[ ] = { 0, 1, 2, 3, 4}; //数组有5个元素
注意:在定义字符串时
3、一维数组的使用
C语言规定只能逐个引用数组元素,不可以一次引用整个数组
使用形式:arr_name [ n ] ;
eg: int arr1[ 5 ] = { 0, 1, 2, 3, 4};
t = arr1[3]; //此时 t = 3;表示取数组中下标为3 的元素,数组中第一个元素的下标为 0 ,以此类推。
注意: 数组的大小可通过计算得到
int arr2[ ] ={ 0, 1, 2, 3, 4};
int sz = sizeof(arr2) / sizeof(arr2[0]);
4、一维数组在内存中的存储
代码 结果
结论:数组在内存中是连续存放的。
5、指针的初识
因在下面的内容中涉及到使用指针访问数组的知方法,故在这里大致描述一下指针。
首先,看一下内存的编址:
(1)、内存中的每个内存单元对应一个地址;
(2)、在 32 位平台上指针的大小为 4 个字节,在 64 位平台上指针的大小为 8 个字节。
指针变量指存放一个地址的变量。
eg:int n = 10;
int *p = &n; //指针变量 p 存放的是 n 的地址
*p = 20; //所改变实质上是 n 的值
6、一维数组的指针访问
(1) 代码 结果
结论:数组名就是数组首元素的地址。
(2) 代码 结果
结论:数组名+整数 i 运算 = 数组下标为 i 的地址。
7、二维数组的创建
与一维数组的创建类似;
eg: int arr1[3][4];
double arr2[ ][4]; // 行可以省略,列不可以省略
8、二维数组的初始化
与一维数组的初始化类似;
eg: int arr1[3][4] = { { 1, 2, 3, 4 } , { 5, 6, 7, 8 } , { 9, 10, 11, 12 } };
int arr2[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
int arr3[3][4] = { { 3 }, { 5 }, { 9 } };
int arr4[3][4] = { { 3 }, { 0, 5 },{ 0, 0, 9}};
9、二维数组的使用
与一维数组一样使用下标引用;
使用形式:arr_name[ i ][ j ]; //指下标为(i,j)的元素
eg: int arr1[3][4] = { { 1, 2, 3, 4 } , { 5, 6, 7, 8 } , { 9, 10, 11, 12 } };
printf("%d\n",arr1[2][1]); //输出的值为10
10、二维数组在内存中的存储
代码 结果
结论:二维数组在内存中的存储也是连续的。
11、二维数组的指针访问
(1) 代码 结果
结论:数组名就是数组首元素的地址。
(2) 代码 结果
结论:数组名+整数4* i +j 运算 = 数组下标为 ( i , j) 的地址
12、有关数组的运算
(1)、一维数组
注:*&a 相当于 a
(2)、字符数组
代码 结果
注:strlen()函数是用来求一个字符串长度的。因为arr的结尾不是'\0',strlen()会继续向后检索,直到遇到'\0',而这些区域的内容是不确定的,故输出的结果中不确定返回多少。
代码 结果
代码 结果
(3)、二维数组
总结:sizeof(数组名):这里的数组名表示整个数组;
& 数组名 :这里的数组也表示整个数组。
13、数组作为函数参数
在写代码时,在数组作为参数的时候,实际上只是把数组首元素的地址传了过去,不会把整个数组传过去。
eg: void Max(int arr1[ ])
{
int sz = sizeof(arr1) / sizeof(arr1[0]);
}
分析:在上面这个例子中,int arr1[ ]表示一个指针,即 int *arr1;
所以我们会得到 sz = 1;而不能表示整个数组元素的个数。
往往我们在使用数组作为参数的时候,会选择把数组大小的相关内容传过去(比如直接传过去数组元素的个数 或者 传过去左右下标,用左右下标控制位置)。