C | 数组的相关知识(一)


目录

  • 前言
  • 数组的定义
  • 数组相关的知识点
    • 一维数组的创建
    • 一维数组的初始化
    • 一位数组的使用
    • 一位数组在内存中的存储
    • 二维数组的创建
    • 二维数组的初始化
    • 二维数组的使用
    • 二维数组在内存中的存储
  • 结语

前言 我相信在任何编程语言中,数组都是一个极为重要的数据类型。
而在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的初始化方式会默认在最后加上‘\0’来作为字符串结束的标志。
此时arr1这个数组的元素个数位4。
而arr2的初始化方式不会在最后加上‘\0’,那么这时候,如果要用strlen函数来求字符串的长度的时候,得到的结果就会是随机值。
一位数组的使用 数组的访问,我们需要用到一个操作符:[ ] ,下标解引用操作符。
当我们要访问数组的元素的时候,需要用到这个操作符号。
注意
当我们访问数组的第一个元素的时候,下标应为0,即arr[ 0 ]。
代码演示如下:
#include int 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开始。
数组的大小可以通过计算得到。
一位数组在内存中的存储 数组在内存中的存储是连续的。
代码演示如下:
#include int main() { int arr[10] = { 0 }; int i = 0; for (i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i) {printf("&arr[%d] = %p\n", i, &arr[i]); } return 0; }

当我们执行上面的代码的时候,会得到如下的结果
C | 数组的相关知识(一)
文章图片

我们可以看到,每一个元素的地址是连续的,而且随着下标的增大,地址也在增大。
每相邻的两个元素的地址,相差的数值等于元素对应的数据类型的大小。
如:上述代码中的数组的元素是整型的,而整型数据的大小是4个字节,所以相邻元素的地址就相差4。
内存图如下:
C | 数组的相关知识(一)
文章图片

二维数组的创建 二位数组的创建与一维数组的创建相似。
代码演示如下:
int arr[3][4]; char arr[3][5]; double arr[2][4];

其中第一个[ ]表示该数组有多少层 ,第二个[ ]每一层有多少个元素。
二维数组的每一层都可以看成是一个一维数组。
因此,二维数组其实也可以看成是一维数组,而这个数组的每一个元素也是一个一维数组。
【C | 数组的相关知识(一)】(有种套娃的感觉了~)
二维数组的初始化 二维数组的初始化也有几种不同的方式
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; }

二维数组在内存中的存储 同样是和一维数组的存储方式一样,在内存中是连续的。
代码演示如下:
#include int 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] = %p\n", i, j, &arr[i][j]); } } return 0; }

上述的代码运行结果如下:
C | 数组的相关知识(一)
文章图片

由此我们知道,二维数组也是连续存放的,第二层的第一个元素是接着第一层的最后一个元素的。
结语 今天我们就先了解一维数组和二维数组相关的基本知识,关于数组越界和数组传参的内容,我们放在下期哦~
还是那句老话,创作不易呀,希望小伙伴们可以动动小手,给我一个关注、一个赞还有评论哦~
由于本人能力有限,如果有错误的地方,希望大佬们可以指出!
C | 数组的相关知识(一)
文章图片

    推荐阅读