C语言 二维数组的线性存储特性

线性存储

由于计算机的内存是一维的,多维数组的元素应排成线性序列后存入存储器。数组一般不做插入和删除操作,即结构中元素个数和元素间的关系不变。所以采用顺序存储方法表示数组。

种类

行优先存储

将数组元素按行向量排列,第i+1个行向量紧接在第i个行向量后面。

如:二维数组A[m][n]按行优先存储的线性序列为:

A[0][0]、A[0][1]…A[0][n]、A[1][1]、A[1][1]…A[1][n]…A[m][n]、A[m][1]…A[m][n]

PASCALC语言中数组按行优先顺序存储。

列优先存储

将数组元素按列向量排列,第i+1个列向量紧接在第i个列向量后面。

如:二维数组A[m][n]按列优先存储的线性序列为:

A[0][0]、A[1][0]…A[m][0]、A[0][1]、A[1][1]…A[m][1]…A[m][1]、A[0][n]…A[m][n]

FORTRAN(几乎见不到这门语言了)语言中,数组按列优先顺序存储。

程序验证:C语言二维数组线性存储

看下面代码,通过对下面两种二维数组进行元素地址打印和元素值打印,你会发现,各个元素之间正好隔了一个当前数据类型的步长(下面代码是int类型,所以步长是4)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void PrintArray(int* arr, int len) {
	for (int i = 0; i < len; i++) {
		printf("%d ", arr[i]);
	}
	printf("\n");
}

//二维数组的线性存储
void test() {
	int arr[][3] = {
		{ 1, 2, 3 },
		{ 4, 5, 6 },
		{ 7, 8, 9 }
	};

	int arr2[][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	int len = sizeof(arr2) / sizeof(int);

	//如何证明二维数组是线性的?
	//通过将数组首地址指针转成Int*类型,那么步长就变成了4,就可以遍历整个数组
	int* p = (int*)arr;
	printf("打印 arr 数组各个元素地址:\n");
	for (int i = 0; i < len; i++) {
		printf("%xd ", &p[i]);
	}
	printf("\n");


	int* p2 = (int*)arr2;
	printf("打印 arr2 数组各个元素地址:\n");
	for (int i = 0; i < len; i++) {
		printf("%xd ", &p2[i]);
	}
	printf("\n");


	printf("打印整个数组元素:\n");
	for (int i = 0; i < len; i++) {
		printf("%d ", p[i]);
	}
	printf("\n");


	printf("打印整个 arr 数组:\n");
	PrintArray((int*)arr, len);
	printf("打印整个 arr2 数组:\n");
	PrintArray((int*)arr2, len);
}

int main()
{
	test();
	return 0;
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清河大善人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值