C语言——数组基本知识(二)
目录
一.二维数组
定义一个二维数组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:
题目分析
-
题目内容
- 定义了一个二维数组
ab[3][4]
。 - 定义了一个字符指针
*ptr
,并将其强制转换后指向ab
数组。 - 指针
ptr
增加了 20。 - 问题是:
ptr
指向哪个元素?
- 定义了一个二维数组
-
解题思路
- 首先,
ab
是一个二维数组,类型为int
,有 3 行 4 列。在内存中,它是按行存储的。 - 当
ptr
被强制转换为(char*)ab
时,ptr
开始指向ab
数组的首地址,但被视为char*
类型。 - 由于
ptr
是char*
类型,每次增加 1,实际上是移动 1 个字节。当ptr += 20
时,它在内存中移动了 20 个字节。 - 因为
int
类型通常占 4 个字节(假设 32 位系统),20 个字节相当于移动了 5 个int
元素。
- 首先,
-
计算过程
- 从
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语言编程练习:验证哥德巴赫猜想 进制转换 rand函数-CSDN博客
“山林不向四季起誓,荣枯随缘”——C语言(爱心+祝福语)代码分享_爱心代码朋友圈文案-CSDN博客
C语言——二分法查找讲解_c语言二分法查找一个数-CSDN博客
C语言穷举法算法经典题型(二)_编写程序,输入x,输出y y= x2+3x-4 (x≤5) =x2-5x+7 (x>5) 输入 一个-CSDN博客
C语言穷举法算法经典题型(一)_c语言穷举法经典例题-CSDN博客
原文地址:https://blog.csdn.net/hjx1235/article/details/144012512
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!