c语言之——指针与二维数组

一、数组的行优先和列优先

对于二维数组,有行优先顺序和列优先顺序两种不同的存储方式。由于计算机内存是一维的,多维数组的元素应排成线性序列后存人存储器
数组一般不做插入和删除操作,即结构中元素个数和元素间关系不变化。一般采用顺序存储方法表示数组。

这两种方式在数学上的直观描述如下,给定如下矩阵:

根据行优先的原则,其排序方式为

根据列优先的原则,其排序方式为

行优先或者列优先没有好坏,但其直接涉及到对内存中数据的最佳存储访问方式。因为在内存使用上,程序访问的内存地址之间连续性越好,程序的访问效率就越高;相应地,程序访问的内存地址之间连续性越差。所以,我们应该尽量在行优先机制的编译器,比如C/C++,CUDA等等上,采用行优先的数据存储方式;在列优先机制的编译器,比如Fortune, Matlab等等上,采用列优先的数据存储方式。

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

C语言中的二维数组是按行排列的,也就是先存放 a[0] 行,再存放 a[1] 行,最后存放 a[2] 行;每行中的 4 个元素也是依次存放。数组 a 为 int 类型,每个元素占用 4 个字节,整个数组共占用 4×(3×4) = 48 个字节。
C语言允许把一个二维数组分解成多个一维数组来处理。对于数组 a,它可以分解成三个一维数组,即 a[0]、a[1]、a[2]。每一个一维数组又包含了 4 个元素,例如 a[0] 包含 a[0][0]、a[0][1]、a[0][2]、a[0][3]。
假设数组 a 中第 0 个元素的地址为 1000,那么每个一维数组的首地址如下图所示:
把二维数组拆解成一维数组

二、二维数组的定义与初始化

常规定义与初始化方法:

int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };//按行分段赋值
int a[5][3]={80, 75, 92, 61, 65, 71, 59, 63, 70, 85, 87, 90, 76, 77, 85};//按行连续赋值
int a[][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};//如果对全部元素赋值,那么第一维的长度可以不给出
int a[3][3] = {{0,1}, {0,0,2}, {3}};//可以只对部分元素赋值,未赋值的元素自动取“零”值。

指针定义方法

  • 指向二维数组的行的数组指针,列必须相同,行可以不同!
int arrayA[2][3] = { {1, 2 ,3},{11,22,33}};
int arrayB[2][5] = {{5,6,7,8,9},{55,66,77,88,99}};
int (*array1)[3] = NULL;//一定要加上括号,因为()的优先级高于*
int (*array2)[5] = NULL;

array1 = arrayA;
array2 = arrayB;
  • 指向二维数组第一个元素a[0][0]的首地址

下面实例中,array 是一个列指针,这个列指针指向的元素是一个整型,array + 1操作会使array指针移动一个int大小的距离,也就是移动一列,故曰列指针。

int arrayA[2][3] = { {1, 2 ,3},{11,22,33}};
int *array = NULL;
array = &arrayA[0][0];

注意:以下定义方式是错误的!因为a代表着除了第一列以外的列数的维数大小,如a+1的地址就是a[1]的地址,也就是a[1][0]的地址,而p仅是整形指针的指针,没跨越一次就是4字节,因此他们的大小是不匹配的,所以这样子直接等于号是不正确的。

int   a[3][6];
int **p=a;

 

 

ref:

https://blog.csdn.net/xia__mu/article/details/99879877

http://c.biancheng.net/view/2022.html

http://c.biancheng.net/view/1829.html

https://blog.csdn.net/Canhui_WANG/article/details/52242496

https://zhidao.baidu.com/question/161985206.html

https://blog.csdn.net/yangzhao0001/article/details/51983026?utm_source=blogxgwz3

https://www.jb51.net/article/157379.htm

https://blog.csdn.net/nice__xixi/article/details/82081595?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=1328690.10581.16165869883762641&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值