本片博客会从以下几个方面带大家了解一下数组
1.一维数组的创建和初始化;2.一维数组的使用;3.一维数组在内存中的存储
4.二维数组的创建和初始化;5.二维数组的使用;6.二维数组在内存中的存储
7.数组越界;8.数组作为函数参数;
接下来本博主带大家一一领略
一、一维数组的创建和初始化
数组是一组相同类型元素的集合。
数组的创建方式:
type_t arr_name [const_n];
// type_t 是指数组的元素类型
//arr_name指数组名
// const_n 是一个常量表达式,用来指定数组的大小
这里我们注意:
C99 标准之前 数组的大小只能是常量表达式
C99 标准中引入了:变长数组的概念,使得数组在创建的时候可以使用变量,但是这样的数组不能初始化
下面就是一个简单数组创建:
1. int arr1[10]; 2. char arr1[];
数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)。
下面是数组的简单初始化:
1. int arr1[10] = {1,2,3,4,5,6,7,8,9,10};//完全初始化 2. int arr2[10] = { 1,2,3 };//不完全初始化,剩余的元素默认都是0 3. int arr3[10] = { 0 };//不完全初始化,剩余的元素默认都是0 4. int arr4[] = { 0 };//省略数组的大小,数组必须初始化,数组的大小是根据初始化的内容来确定 5. int arr5[] = { 1,2,3 }; 6. char arr1[] = "abc";//一个元素 7. char arr2[] = {'a', 'b', 'c'};//三个元素 8. char arr3[] = { 'a', 98, 'c' };
初始化时一定是需要给一些合理的初始值
int arr6[];//错误初始化
二、一维数组的使用
数组必须先定义,然后使用。C 语言规定,只能逐个引用数组元素,而不能一次引用整个数组。前面讲过,数组元素的表示形式为:
数组名[下标];
下标可以是整型常量或整型表达式,比如:
a[0] = a[5] + a[7] - a[2 * 3];
千万要注意,定义数组时用到的“数组名[常量表达式]”和引用数组元素时用到的“数组名[下标]”是有区别的,定义数组时的常量表达式表示的是数组的长度,而引用数组元素时的下标表示的是元素的编号。比如:
1. arr[5]={1,2,3,4,5} 2. //表示有五个元素,分别存储1,2,3,4,5 3. //下标从0开始,到你所定义的数组长度-1结束,此处是5; 4. //a[0]=1,a[1]=2,a[2]=3,a[3]=4,a[4]=5;
关于数组在scanf()与printf()中的使用,一般借助for语句
1. int i = 0; 2. int arr[5] = {1,2,3,4,5}; 3. for(i = 0;i<5;i++) 4. { 5. scanf("%d",&arr[i]); 6. } 7. for(i = 0;i<5;i++) 8. { 9. printf("%d",arr[i]); 10. }
这里注意:由于在使用时表示的时元素的编号,所在输入时要加上&
三、一维数组在内存中的存储
数组在内存中的存储是连续的,我们写一个代码给大家看一下就明白了
1. int main() 2. { 3. int arr[10] = { 1,2,3,4,5 }; 4. int sz = sizeof(arr) / sizeof(arr[0]); 5. int i = 0; 6. for (i = 0; i < sz; i++) 7. { 8. printf("&arr[%d] = %p\n", i, &arr[i]); 9. } 10. 11. return 0; 12. }
这时候我们运行一下
打印坐标后我们发现每个坐标中间相差4,那是因为我们这里用的是int,所以占4个字节
仔细观察输出的结果,可知随着数组下标的增长,元素的地址,也在有规律的递增。 由此可以得
出结论:数组在内存中是连续存放的。
总结:
- 数组在内存中开辟是线性连续且递增的。
- 在c语言中,任何变量(基本变量,指针变量,结构体变量,数组变量)的空间都是整体开辟,但任何元素的起始地址一定是开辟字节当中最小的。
四、二维数组的创建和初始化
二维数组的创建
1. //数组创建 2. int arr[3][4];//[行数][列数] 3. char arr[][5]; 4. double arr[2][4];
二位数组的初始化
1. //数组初始化 2. int arr[3][4] = {1,2,3,4}; 3. int arr[3][4] = {{1,2},{4,5}}; 4. int arr[][4] = {{2,3},{4,5}};
注意:
花括号中的一个花括号代表一个一维数组的初始化。当里面无花括号分组时,按照顺序从第一个开始逐个进行初始化。余下的未赋值的元素用0初始化
五、二维数组的使用
二维数组的使用也是通过下标的方式,用双重循环嵌套进行索引使用。 看代码:
1. #include <stdio.h> 2. int main() 3. { 4. int arr[3][4] = { 0 }; 5. int i = 0; 6. for (i = 0; i < 3; i++) 7. { 8. int j = 0; 9. for (j = 0; j < 4; j++) 10. { 11. arr[i][j] = i * 4 + j; 12. } 13. } 14. for (i = 0; i < 3; i++) 15. { 16. int j = 0; 17. for (j = 0; j < 4; j++) 18. { 19. printf("%d ", arr[i][j]); 20. } 21. } 22. return 0; 23. }