Bootstrap

C语言——数组基本知识(二)

目录

一.二维数组

        ① 二维数组的初始化:

② 内部数组元素定位算法

例1:

例2:

题目分析

二.多维数组

三.练习矩阵相加,相乘

        ①矩阵相加

②矩阵相乘:

往期回顾:


一.二维数组

        定义一个二维数组arr[3][4]表示一个三行四列的矩阵。

        ① 二维数组的初始化:

int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};相当于

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

int a[3][4]={{1},{5},{9}};等价于

int a[3][4]={{1,0,0,0},{5,0,0,0},{9,0,0,0}};

int a[3][4]={{1},{5,6}};相当于

        int a[3][4]={{1},{5,6},{0}};

        int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};等价于:

int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12};

② 内部数组元素定位算法

通过在数组的起始地址上添加偏移量,可以到达数组中的每个元素
地址元素i =起始数组地址+偏移量

例1:

      int ab[3][4];   ab地址为10020, int 四个字节大小   &ab[1][3]是多少?

首先这个数组是3行4列的矩阵,我们可以画出:

 &ab[1][3]表示相对于首元素偏移一行三列,得到如上图箭头所指的位置。

例2:

题目分析

  1. 题目内容

    • 定义了一个二维数组ab[3][4]
    • 定义了一个字符指针*ptr,并将其强制转换后指向ab数组。
    • 指针ptr增加了 20。
    • 问题是:ptr指向哪个元素?
  2. 解题思路

    • 首先,ab是一个二维数组,类型为int,有 3 行 4 列。在内存中,它是按行存储的。
    • ptr被强制转换为(char*)ab时,ptr开始指向ab数组的首地址,但被视为char*类型。
    • 由于ptrchar*类型,每次增加 1,实际上是移动 1 个字节。当ptr += 20时,它在内存中移动了 20 个字节。
    • 因为int类型通常占 4 个字节(假设 32 位系统),20 个字节相当于移动了 5 个int元素。
  3. 计算过程

    • ab的首地址开始,移动 20 个字节(ptr += 20)。
    • 由于每个int元素占 4 个字节,20 个字节相当于移动了 5 个int元素。
    • 二维数组ab[3][4]按行存储,所以先填满第一行(4 个元素),再填第二行。
    • 移动 5 个元素后,ptr指向第二行的第一个元素(索引为[1][0])。

答案:ptr对应ab[1][0]元素。

二.多维数组

        三维数组可以看作是一本数据表(第三个下标称为rank);
        四维数组可以表示为一个书架,其中第四维用来声明书架上想要的书;

        五维数组可以看作是一个装满书的书柜,其中第五维指的是书柜中选定的书架

        三维、四维、五维、六维或更多维的数组可以被视为数学n元组

三.练习矩阵相加,相乘

        ①矩阵相加

代码如下:

int main()
{
	int i;
	int j;
	int arr1[3][4];
	int arr2[3][4];
	int arr[3][4];
	for (i = 0; i <= 2; i++) {
		for (j = 0; j <= 3; j++) {
			scanf("%d", &arr1[i][j]);
		}
	}
	for (i = 0; i <= 2; i++) {
		for (j = 0; j <= 3; j++) {
			scanf("%d", &arr2[i][j]);
		}
	}
	for (i = 0; i <= 2; i++) {
		for (j = 0; j <= 3; j++)
		{
			arr[i][j] = arr1[i][j] + arr2[i][j];
		}
	}
	for (i = 0; i <= 2; i++) {
		for (j = 0; j <= 3; j++) {
			printf("%d", arr[i][j]);
		}
	}
	return 0;
}

②矩阵相乘:

代码如下:

int main()
{
	int i=0;
	int j=0;
	int k;
	int m;
	int arr1[3][4];
	int arr2[4][3];
	int arr[3][4];
	for (i = 0; i <= 2; i++) {
		for (j = 0; j <= 3; j++) {
			scanf("%d", &arr1[i][j]);
		}
	}
	for (i = 0; i <= 3; i++) {
		for (j = 0; j<= 2; j++) {
			scanf("%d", &arr2[i][j]);
		}
	}
	for (k = 0; k <= 2; k++)
	{
		for (m = 0; m <= 2; m++)
		{
			arr[k][m] = 0;//定义初始值是0
			for (i = 0; i <= 3; i++)
				arr[k][m] += arr1[k][i] * arr2[i][m];//可以通过举例子来发现规律
		}
	}
	for (i = 0; i <= 2; i++) {
		for (j = 0; j <= 2; j++) {
			printf(" %d", arr[i][j]);
			if (j == 2)
			{
				printf("\n");
			}
		}
	}
	return 0;
}

运行结果如下:

本期数组基本知识就介绍到这里~~~

往期回顾:

C语言——数组基本知识(一)-CSDN博客

C语言——数组逐元素操作练习-CSDN博客

C语言编程练习:验证哥德巴赫猜想 进制转换 rand函数-CSDN博客

C语言——函数基本知识(三)-CSDN博客

C语言——函数基本知识(二)-CSDN博客

C语言 ——函数基本知识(一)-CSDN博客

“山林不向四季起誓,荣枯随缘”——C语言(爱心+祝福语)代码分享_爱心代码朋友圈文案-CSDN博客

C语言——二分法查找讲解_c语言二分法查找一个数-CSDN博客

C语言穷举法算法经典题型(二)_编写程序,输入x,输出y y= x2+3x-4 (x≤5) =x2-5x+7 (x>5) 输入 一个-CSDN博客

C语言穷举法算法经典题型(一)_c语言穷举法经典例题-CSDN博客

;