C语言的二维数组的一些分析

来源:互联网 发布:telnet 指定端口号 编辑:程序博客网 时间:2024/06/03 15:33

先看一个一维数组 b[5] = {1,2,3,4,5} ;  在一维数组b中,b 表示数组的起始地址,其他元素都可以通过b+1,b+2类似的操作来寻址。例如:(b+1) == &b[1] ,*(b+1) == b[1] 


C语言中的二维数组在结构上是由多个一维数组组成,每个一维数组的行头地址又是以一维数组的方式连接。

所以可以将二维数组可以视为多个一维数组来寻址,行头寻址既可以按列寻址也可以按行寻址。

例如二维数组a[3][4] = {{1,2,3,4},{5,6,7,8},{910,11,12}} 中

structrue:

行\列



aa[0][0]   1a[0][1]   2a[0][2]   3a[0][3]   4a+1a[1][0]   5a[1][1]   6a[1][2]   7a[1][3]   8a+2a[2][0]  9a[2][1]  10a[2][2]   11a[2][3]  12

是由列数组中a[0] = {1,2,3,4}  、a[1]={5,6,7,8} 、a[2]={9,10,11,12} 以及 行数组 a ={ a[0],a[1],a[2]} 构成,在列数组中,*a[0] == a[0][0],*a[1] == a[1][0] 以此类推!

在行数组中 , a,a+1,a+2 也可以用来表示 &a[0],&a[1],&a[2];所以 &a[0]+1 ==  &a[1]


在存储上二维数组(多维数组)和一维数组一样是顺序方式

所以二维数组可以视为一个大的一维数组操作,数组中下标实际相当于地址值的位移,数组中任意一个元素都可以通过参考元素的地址位移得到,位移量为 (i2-i1)*列数+(j2-j1)

如果起始元素是行地址,还可以通过诸如a[1][6]、(*(a+1))[6]、*(*(a+1)+6),在不越界的情况下,a[1][-2]之类的也是合法的表达式。

例如元素a[2][3]  ==  a[1][6] == (*(a+1))[6] == *(*(a+1)+6) == *(&a[1][0] + 6) ==  (*a+4)[6]  ;


memory:


a[0][0]a[0][1]a[0][2]a[0][3]a[0][4]a[0][5]a[0][6]a[0][7]a[0][8]a[0][9]a[0][10]a[0][11]……Arraya[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]…………123456789101112……



涉及到行数组的运算,c语言会自动在行数组中进行寻址。例如 &a +1 == &a[2][3]+1, &a[0] +1 == &a[1] ,&a[0][1]+1 == &a[0][2]  。

所以元素a[2][3] == *(*(&a[0]+1)+6)  == *(*(&a[1])+6) 


二维数组特殊的数据结构和存储方式,使得二维数组可以当做一维数组操作。例如a[3[][4] 可以视为包含4列,变量名为a[3]的一维数组。


形如*((&a[0])[1]) 、(*(&a[0]))[1]、*(&a[0])[1]的区别

*((&a[0])[1])  :  形如b[1],其中b 为(&a[0]),在行数组中 (&a[0])[1] == *(&a[0] +1 ), 所以  *((&a[0])[1])  == a[1][0] ;

*(&a[0])[1]     : 同上;

(*(&a[0]))[1]  : 同上,在行数组中计算 (*(&a[0]))  == a[0] ,所以 (*(&a[0]))[1]  == a[0][1] ;


总结:

以上的分析对于多维数组应该也是适用的!!! 

a == &a[0] ;*a == a[0] ;*a[0] == a[0][0]  

a+1 == &a[1] ; *(a+1) == a[1];*a[1] == a[1][0]

a[1] == *a+4;&a[1] == &a[0]+1 == (&a[0])[1];

因为[]的优先级比*高,参数申明必须指明列数,二维数组也可写成(*a)[4]  形式! 



二维数组寻址和操作!!

……1


5


9

12…………指针value指针value指针value指针a*(*a)a+1*(*(a+1))a+2**(a+2)a+3 或 &a+1   *a*(*a+0)*a+4*(*a+4)*a+8*(*a+8)……*a = a[0](*a)[0]……(*a)[4]……(*a)[8]……a[0]*a[0]a[1]*a[1]a[2]*a[2]……a[0]+0……a[0]+4*(a[0]+4)a[0]+8……&a[0]+0*(*(&a[0]+0))&a[0]+1*(*(&a[0]+1))&a[0]+2…………&(a[0][0])……&(a[0][0])+4……&(a[0][0])+8…………&(a[0][0])……&(a[0][4])……&(a[0][8])…………&a[0][0]*(&a[0][0])&a[1][0]……&a[2][0]…………


 
0 0
原创粉丝点击