C语言绝对值得一看的常识讲解:批量同类型数据的组织——数组篇 篇2(二维)

上一篇介绍了批量同类型数据的组织——数组,但数组的知识点还是还是比较多的,所以只讲解了一维数组的知识点,这里在和大家分享一下二维数组。

二维数组

相同类型的一维数组,按照一定次序可以构成二维数组。相同类型的二维数组,按照一定的次序又可以构成三维数组,以此类推。二维以及二维以上的数组,称为多维数组。对于多维数组,也需要先定义,然后才能使用。当然,这里只介绍二维数组。

目录

1.二维数组的定义

2.二维数组的地址详解

3.二维数组的引用

4.二维数组的初始化

5.二维数组在内存中的存储

6.二维数组的简单应用


1.二维数组的定义

类似于一维数组的定义,定义二维数组的一般形式为

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

int a[3][4];//这里就是一个二维数组,有三个元素,每一个元素是包含4个整型元素的一维数组 

 a显然包含了三个一维数组,三个一维数组的名字分别为a[0],a[1],a[2]。这三个一维数组不须另作说明,即可直接使用。

注意:

①整型常量表达式1的值,表示第一维下标的长度,说明包含几个一维数组;整型常量表达式2的值,表示每一个一维数组包含几个元素。

②二维数组元素的个数=整型常量表达式1*整型常量表达式2

2.二维数组的地址详解

二维数组的元素比较特殊——就是上面介绍的一维数组作为元素,当然也可以认为是由若干基本元素构成的。

C语言规定,数组名代表指向数组首元素的指针,或者说数组名代表数组的首地址。而在二维数组a[3][4]中,a[0],a[1],a[2]这些都是一维数组的首地址,a则是二维数组的地址。

注意:

指针a(二维数组的地址)指向数组的每一行,称为二维数组的行指针。行指针加1后,表明指针在行的方向移动了一行,或者说移动了二维数组a的一个一维数组的距离(如果我们从基本元素级别来讲,相当于移动了4个元素的距离)。

指针a[0]指向某一行的地址,称其为二维数组的列指针。列指针加1后。表示指针在列的方向移动了一列,或者说移动了一维数组a[0]的一个元素的距离。

②C语言允许行、列指针进行转换运算。

*a,将行指针转换为列指针;&a[0],将列指针转换为行指针。

3.二维数组的引用

引用二维数组元素使用数组名、该元素在数组中的行下标和列下标(整型常量表达式1为行下标,整型常量表达式2为列下标)

数组名 [整型表达式1] [整型表达式2];

①其中,整型常量表达式1的运算结果为数组的行下标,其取值范围是[0,列数-1];整型常量表达式2的运算结果作为数组元素的列下标,其取值范围是[0,列数-1]。

定义数组后,数据中的每一个元素其实就相当于一个变量,同简单变量一样,也具有变量名、变量值、类型和地址的变量的基本类型。

②在C语言中,二维数组不能实现整体读入和整体输出。可以使用循环语句,在循环语句中读取键盘的输入并送到指定数组元素中,在循环体中输出数组元素。

将二维数组的行下标和列下标分别作为循环变量,通过两层循环就可以依次访问二维数组的所有元素。由于二维数组在内存中按行优先存储,因此,将行下标作为外层循环变量,列下标作为内层循环变量,程序的执行效率较高。

③在C语言中,赋值除了初始化时对数组整体进行整体赋值,除此之外没有提供数组整体赋值的语句。 

4.二维数组的初始化

定义二维数组变量后,编译器会给该变量分配一段连续的存储空间,但是数组变量是“值无定义的”,可以在定义二维数组变量时为数组元素赋初值,对二维数组进行初始化。

初始化二维数组有如下两种形式。

①所有数据值写在一个大括号内,一般形式如下:

数据类型 数组名 [整型常量表达式1] [整型常量表达式2] = {初值表};

②每一行的数据值写在一个大括号内,一般形式如下:

 数据类型 数组名 [整型常量表达式1] [整型常量表达式2] ={ {初值表},{初值表},{初值表},…,{初值表}};

其中,初值是由逗号分隔的数据值; 整型常量表达式1和整型常量表达式2分别表示二维数组的行数和列数。为了增强程序的可读性,建议采用第二种方式进行数组初始化。

将初值表中各数据顺序赋给数组中相应的元素。如果提供的初值个数小于数组长度,则未指定数组元素被赋值为0,也称为部分初始化;如果提供的初值多于数组个数,取决于编译器,有些编译器会忽略多余的初值,有些编译器会给出错误信息。

注意:

整型常量表达式1可以省略,整型常量表达式2不可以省略。大家可以类比“一维数组初始化时赋初值但是常量表达式没有填写”来理解,因为这种初始化被系统默认为完全初始化,即赋初值的个数等于数组元素的个数;同理二维数组也是这样,即赋初值的个数等于数组元素的个数,但是二维数组的单个元素的数据类型是一维数组,那么我们必须标清二维数组元素的数据类型(含几个元素的一维数组呢?),所以整型常量表达式1可以省略,整型常量表达式2不可以省略。

5.二维数组在内存中的存储

二维数组在逻辑上是二维的,但仍需占用连续的内存区域。二维数组装入内存时,各元素排序时先顺序存放第一行元素,再依次存放下一行的元素。

补充知识点——数组名:

其实数组名就是数组首元素(第一个元素)的地址,但是有两个特殊情况:

①sizeof(数组名),sizeof中单独放数组名,这里的数组名表示整个数组,计算的是整个数组的大小, 单位是字节

②&数组名,这里的数组名表示整个数组,取出的是整个数组的地址(整个数组的地址和数组首元素的地址是有区别的)

特别强调由于多维数组是把比其低一维的数组作为元素的,所以我们在看多维数组时,可以直接找到数组名后面的“[数组大小]”,这里的数组大小就是多维数组中含有的元素个数——比其低一维的数组的个数。

6.二维数组的简单应用

打印一个10行的杨辉三角,代码如下:

 
#include<stdio.h>
 
int main()
{
	int arr[10][10] = { 0 };//初始化数组全部为0
	int i = 0;
	int j = 0;
 
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j <= i; j++)
		{
			if ( j == 0)//第一步:打印边边为1的部分
				arr[i][j] = 1;
			else //第二步:打印剩余部分
			{
				arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
			}
		}
	}
	//选取数组一部分内容打印出三角形
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j <= i; j++)
		{
			printf("%3d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值