c语言参数列表定义一个三维数组,C语言之多维数组 - zy010101的个人空间 - OSCHINA - 中文开源技术交流社区...

多维数组

如果,数组的维数不止一个,我们通常称为多维数组。例如,下面的声明。

int num[3][3];

直观看起来,这是一个3行3列的数组。但是实际上在内存中,数组是按照线性顺序存放的。也就是说,我们把上面这个数组理解为一个一维数组,只不过这个一维数组的3个元素都是一维数组而已。如下所示:

1181f9e9591a4e70a83637f5fe5ae790.png

那么,如果是个三维数组,也按照同样的方式来理解,例如:int num[3][6][9]; 我们可以理解它是一个包含3个元素的数组,而这3个元素是包含6个元素的数组,这6个元素又都是包含9个元素的数组。

数组名

正如一维数组那样,一维数组名是指向数组起始元素的指针。那么多维数组名就是指向一个包含X个XXX类型的数组的指针。举个例子,我们还是拿上面的num来说事。这个num是一个指向包含3个int类型的数组的指针。即int (*num) [3];

初始化

二位数组的初始化可以按照我们上述的理解来进行。例如:

int num[3][3] = { {1,2,3},{4,5,6},{7,8,9} };

当然了,还可以这样

int num[3][3] = { 1,2,3,4,5,6,7,8,9 };

只不过这样的书写方式,是按照顺序给数组元素赋值的。

在初始化多维数组的时候,我们应该采用第一种方式,这种方式使得这个初始化的整个列表更容易阅读。其次,如果是不完整初始化,那么使用第一种方式就非常有用,如下所示。

int num[3][3] = { {1, 2, 3}, {}, {7, 8, 9} };

打印,输出这个数组如下:

143097b13773249f9bdd05b8d170310e.png

下标和间接访问

定义如下数组:

int num[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };

我们可以这样访问数组中的元素。

num[1][1]; //下标访问

*(*(num + 1) + 1); //间接访问

上面的访问是等价的,我们可以尝试打印它们,如下所示:

968c03ab5eb0b33b347e3eade2279770.png

实际上,我们可以混合使用它们,只不过这看起来将不是很容易理解。我并不建议混用他们。例如,下面的表达:

cout << *(num[1] + 1) << endl;

cout << (*(num + 1))[1] << endl;

它们实际上访问的依旧是num[1][1]这个元素,输出的值将会是5。

624d998052e18388a635ee2a4046a566.png

指向数组的指针

前面我们说过,多维数组可以理解为一维数组,只不过这个一维数组的每一个元素也都是数组。那么我们声明一个指向数组的指针应该是下面这个样子的。

int num[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };

int(*p)[3] = num;

这样,p就会指向num的第一行。而p++就会指向第二行,依此类推。这样初始化p以后,我们就可以按照如下的方式使用p

b9ae49772c67612a7692bb172ac850d8.png

也可以使用指针来进行访问,这也没有问题,毕竟数组在内存中是线性存储的。下面初始化p的操作是等价的。

int* p = &num[0][0]; //数组起始元素的地址

int* p = num[0]; //数组第一行第一个元素的地址 == 数组起始元素的地址

这样的指针指向数组以后,在使用的时候多维数组就好像被压扁了一样,变成了一维数组。我们来看一个例子。

15532a05fc4ac72c4f323db0712cb13a.png

多维数组做函数参数

实际上,多维数组做函数参数和一维数组并没有什么区别。实际传递给函数的是指向数组起始元素的指针,只不过这个指针在多维数组这里变成了数组指针。例如:

void function(int (*num)[3]); //这里的这个3不要省略

void function(int num[][3]); //只能省略第一个下标,第二个下标的3一定要有。

int (*p) [];这样的指针虽然是合法的,但是它不应该出现,因为编译器不知道数组的长度,它的结果可能不是你想要的。另外形参num[][3]这里的3不能省略,编译器需要知道第2个以及之后的各个维度的长度才能对各下标进行求值。

下面这个函数将遍历传入的数组num,同时我们将数组第一维的大小也作为参数传入给了函数。

void function(int num[][3],int len)

{

for (size_t i = 0; i < len; i++)

{

for (size_t j = 0; j < 3; j++)

{

cout << num[i][j] << ' ';

}

}

}

本文同步分享在 博客“zy010101”(CSDN)。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值