- 前言
- 数组的定义
- 数组相关的知识点
- 一维数组的创建
- 一维数组的初始化
- 一位数组的使用
- 一位数组在内存中的存储
- 二维数组的创建
- 二维数组的初始化
- 二维数组的使用
- 二维数组在内存中的存储
- 结语
我相信在任何编程语言中,数组都是一个极为重要的数据类型。
而在C语言,数组属于构造类型。
数组的运用十分广泛,因此我们有必要对这一块知识重视。
今天就让我们从零开始学习数组的相关知识吧!
数组的定义数组就是一组相同数据类型的元素的集合。
数组的元素在内存中是连续存放的。
数组相关的知识点 一维数组的创建一维数组的创建格式如下:
数据类型 + 数组名 + [ 数组元素的个数 ]
代码演示如下:
int arr1[10]; char arr2[10]; float arr3[1]; double arr4[20];
需要注意的是,C99标准之前,C语言的数组在指定大小的时候,是不支持用变量来指定大小的,即使是const修饰的常变量也不行。
代码演示如下:
int count1 = 10; int arr1[count1];//这是不允许的 const int count2 = 10; int arr2[count2];一维数组的初始化
数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)。
代码演示如下:
int arr1[10] = {1,2,3};
int arr2[] = {1,2,3,4};
int arr3[5] = {1,2,3,4,5};
char arr4[3] = {'a',98, 'c'};
char arr5[] = {'a','b','c'};
char arr6[] = "abcdef";
注意
数组在创建的时候如果想不指定数组的确定的大小就得初始化。
此时数组会根据初始化的内容来确定数组元素的个数。
但是
字符数组的初始化方式的不同,会导致不同的结果。
char arr1[] = "abc";
char arr2[3] = {'a','b','c'};
上述代码中,arr1的初始化方式会默认在最后加上‘ ’来作为字符串结束的标志。
此时arr1这个数组的元素个数位4。
而arr2的初始化方式不会在最后加上‘ ’,那么这时候,如果要用strlen函数来求字符串的长度的时候,得到的结果就会是随机值。
一位数组的使用数组的访问,我们需要用到一个操作符:[ ] ,下标解引用操作符。
当我们要访问数组的元素的时候,需要用到这个操作符号。
注意
当我们访问数组的第一个元素的时候,下标应为0,即arr[ 0 ]。
代码演示如下:
#includeint main() { int arr[10] = { 0 };//整型数组的不完全初始化 //计算数组的元素个数 int sz = sizeof(arr) / sizeof(arr[0]); //对数组内容赋值,数组是使用下标来访问的,下标从0开始。所以: int i = 0;//做下标 for (i = 0; i < 10; i++)//这里小于10不用加等于号,否则就会造成数组越界 { arr[i] = i; } //输出数组的内容 for (i = 0; i < 10; ++i) { printf("%d ", arr[i]); } return 0; }
小结
数组是使用下标来访问的,下标是从0开始。
数组的大小可以通过计算得到。
一位数组在内存中的存储数组在内存中的存储是连续的。
代码演示如下:
#includeint main() { int arr[10] = { 0 }; int i = 0; for (i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i) { printf("&arr[%d] = %pn", i, &arr[i]); } return 0; }
当我们执行上面的代码的时候,会得到如下的结果
我们可以看到,每一个元素的地址是连续的,而且随着下标的增大,地址也在增大。
每相邻的两个元素的地址,相差的数值等于元素对应的数据类型的大小。
如:上述代码中的数组的元素是整型的,而整型数据的大小是4个字节,所以相邻元素的地址就相差4。
内存图如下:
二位数组的创建与一维数组的创建相似。
代码演示如下:
int arr[3][4]; char arr[3][5]; double arr[2][4];
其中第一个[ ]表示该数组有多少层 ,第二个[ ]每一层有多少个元素。
二维数组的每一层都可以看成是一个一维数组。
因此,二维数组其实也可以看成是一维数组,而这个数组的每一个元素也是一个一维数组。
(有种套娃的感觉了~)
二维数组的初始化二维数组的初始化也有几种不同的方式
int arr[3][4] = {1,2,3,4};
int arr[3][4] = {{1,2},{4,5}};
int arr[][4] = {{2,3},{4,5}};
与一维数组相同,行数可以省略,此时二维数组会根据初始化来确定大小,但是,列不能够省略。
而二维数组初始化的时候,还可以加上{ },方便理解。
二维数组的使用二维数组的使用与一维数组一样,也是通过下标访问的方式。
代码演示如下:
#include二维数组在内存中的存储int main() { int arr[3][4] = { 0 };//不完全初始化 int i = 0; for (i = 0; i < 3; i++)//遍历每一行 { int j = 0; for (j = 0; j < 4; j++)//遍历一行当中的每一个元素 { arr[i][j] = i * 4 + j; } } for (i = 0; i < 3; i++) { int j = 0; for (j = 0; j < 4; j++) { printf("%d ", arr[i][j]); } } return 0; }
同样是和一维数组的存储方式一样,在内存中是连续的。
代码演示如下:
#includeint main() { int arr[3][4]; int i = 0; for (i = 0; i < 3; i++) { int j = 0; for (j = 0; j < 4; j++) { printf("&arr[%d][%d] = %pn", i, j, &arr[i][j]); } } return 0; }
上述的代码运行结果如下:
由此我们知道,二维数组也是连续存放的,第二层的第一个元素是接着第一层的最后一个元素的。
今天我们就先了解一维数组和二维数组相关的基本知识,关于数组越界和数组传参的内容,我们放在下期哦~
还是那句老话,创作不易呀,希望小伙伴们可以动动小手,给我一个关注、一个赞还有评论哦~
由于本人能力有限,如果有错误的地方,希望大佬们可以指出!



