【C语言】详解C语言数组---一维和二维数组

数组


前言

编写程序过程中,有时候会用到大量的相同类型的数据。如果给每个变量都去单独定义,编程过程将会显得繁琐复杂,使用数组可以很好得解决这个问题。
在这里插入图片描述


一、一维数组

什么是数组?数组是一个由若干个相同类型的变量组成的集合,引用这些变量可以使用同一个名字。数组均有连续的存储单元组成,最低地址对应数组的第一个元素,最高地址对应于数组的最后一个元素。数组可以是一维数组也可以是多维数组。

1.1 一维数组的定义

一维数组实际上就是一组相同类型的数据的线性集合。
一维数组的定义形式如下:

类型 标识符[常量表达式];

类型:表示数组中元素的类型
标识符:表示该数组变量的名称,命名规则与变量名一致
常量表达式:定义数组中存放的元素个数,即数组长度

例如:定义一个包含5个整形元素的数组

int arr[5];

1.2一维数组的初始化

一维数组的初始化一般有三种方法。

1.定义数组时直接对数组赋初值(数组元素放在一对大括号中{})。

int arr[5]={1,2,3,4,5};

2.只给一部分元素赋初值,未赋值的元素默认为0。

int arr[5]={1,2,3}; //实际上数组元素是 1,2,3,0,0

3.给所有元素赋初值,不指定数组长度。

int arr[]={1,2,3,4,5};

注意:使用第三种方法时一定要给数组元素赋值,否则会报错。
这样写是错的: int arr[]; ❌ int arr[] = {}; ❌
但是这样写是可以的: int arr[] = {0}; ✅ ==> 给arr数组赋了一个值为0的元素

1.3 一维数组的应用

遍历一维数组:

int arr[5] = {1,2,3,4,5};
//计算数组中的元素个数  
//sizeof(arr)计算数组arr总字节大小  sizeof(arr[0])计算arr数组中一个元素的字节大小 相除等于arr数组元素个数
int sz = sizeof(arr)/sizeof(arr[0]);
for(int i = 0;i < sz;i++){
	printf("%d ",arr[i]);
}
1 2 3 4 5

1.4 一维数组在内存中的存储

一维数组在内存中的存储是怎样的呢?要想知道这个问题,我们先打印一下他的地址。

int arr[5] = { 1,2,3,4,5 };
int sz = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < sz; i++) {
	printf("arr[%d] = %p\n",i ,&arr[i]);
}

在这里插入图片描述
这里我们可以发现,每一个元素都相差4个字节,30–>34–>38–>3C–>40,这是怎么回事呢,我们来看一下图解:
在这里插入图片描述
在我们的内存中,每一小格就代表内存单元中的一个字节,因为int类型在内存中占4个字节,所以地址编号0-3所占的4个字节就是arr[0]这个数组元素,也就是我们打印出来的0076FD30这个地址。同理,地址编号4-7所占的4个字节是arr[1]数组元素,实际地址是0076FD34,arr[2],arr[3],arr[4]这里就不再赘述。

由上面的图解我么可以看出一维数组在内存中存放的特点:

🌟一维数组在内存中是连续存放的。

🌟随着数组下标的增长,存储地址是从低到高增长的。

在这里插入图片描述


二、二维数组

什么是二维数组?二维数组可以把他想象成一张表格,想要定位表格中的一格,就需要知道他的行号和列号。所以二维数组是有两个下标的,反过来说,C语言中,我们将下标有两个的数组称为二维数组。

2.1 二维数组的定义

二维数组可以看作是特殊的一维数组,其各元素仍是一个数组。

数据类型 数组名[常量表达式1][常量表达式2];

常量表达式1定义了数组的行数,常量表达式2定义了数组的列数。不管是行下标还是列下标,索引都是从0开始,定义一个m行n列的二维数组arr[m][n],行下标取值范围0到m-1,列下标取值范围0到n-1,最大下标元素是arr[m-1][n-1]。例如,定义一个3行4列的整形数组:

int arr[3][4];

2.2 二维数组的初始化

二维数组的初始化一般有四种情况。
1️⃣ 将数据写在一个大括号内,按照数组元素排列顺序给数组赋值。

int arr[2][3] = {1,2,3,4,5,6};

如果大括号内的数据少于数组元素个数,系统会默认未被赋值的数组元素为0。

2️⃣ 为所有元素赋初值时,可以省略行下标,但不能省略列下标。

int arr[][3] = {1,2,3,4,5,6};

3️⃣ 使用大括号{}将每一行数据放入一个大括号,内分行给数组元素赋值。

int arr[2][3] = {{1,2,3},{4,5,6}};

4️⃣ 直接对数组元素赋值。

int arr[2][3];
arr[0][0] = 1;
arr[0][1] = 2;

注意:不管使用哪种方法初始化二维数组,二维数组的列下标是不可以省略的。 int arr[2][ ]; ❌
在这里插入图片描述

2.3 二维数组的引用

二维数组元素的引用方式为“数组名[行下标][列下标]”,

int arr[2][3]={1,2,3,4,5,6};
arr[1][2];// 6
arr[2][3];//报错!数组下标越界

同一维数组一样,我们在使用二维数组时也要注意不要超出下标范围。

2.4 二维数组在内存中的存储

我们可以遍历二维数组的地址。

int arr[2][3] = { 1,2,3,4,5,6 };
for (int i = 0; i < 2; i++) {
	for (int j = 0; j < 3; j++) {
		printf("arr[%d][%d] = %p\n", i, j, &arr[i][j]);
	}
}

在这里插入图片描述
在这里插入图片描述
对于二维数组我们可以将其看成是n个一维数组,n为行数。又图我们可以看出,每一行内部的每个元素都是相邻的,地址都是相差4个字节(int类型),跨行之间的元素(如:arr[0][2] 和arr[1][0])地址相差也是4个字节,由此我们可以推断出:

二维数组在内存中的存放方式也是连续

2.5 二维数组的应用

将矩阵行列对换。

int arr1[2][3] = {1,2,3,4,5,6};
int arr2[3][2];
for(int i = 0;i<2;i++){
	for(int j = 0;j<3;j++){
		printf("%d ",arr1[i][j]);
		arr2[j][i]=arr1[i][j]; //通过行列互换使arr2为arr1的转置数组
	}
	printf("\n");
}
printf("\n");
for(int i = 0;i<3;i++){
	for(int j = 0;j<2;j++){
		printf("%d ",arr2[i][j]);
	}
	printf("\n");
}

在这里插入图片描述
通过上述代码,我们很容易的将一个两行三列的矩阵转置成了三行两列的矩阵。


总结

C语言中除了一维数组和二维数组,还有多维数组。多维数组的声明和二维数组是一样的,只是下标更多而已。
arr[表达式1][表达式2]…[表达式n]。其用法和注意事项也是和二维数组一样的,多维数组在日常中使用很少,大部分还是一维和二维数组使用的比较多,所以这里就不再详细说明多维数组了。
数组方面的内容中还有数组的排序算法比较重要,数组的排序就放到下一篇文章中讲解。好了,以上就是关于C语言数组的知识,有什么问题或者文章哪里写的有不对的地方,欢迎评论区或私信告诉我。如果这篇文章对你有帮助的话请点赞收藏关注一下,感谢大家的支持~🌹🌹
在这里插入图片描述

  • 23
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值