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] 形式!
二维数组寻址和操作!!
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]………………
- C语言的二维数组的一些分析
- c语言中二维数组的一些试验结果
- C语言的二维数组
- c语言中二维数组的问题
- C语言,二维数组时候的指针
- C语言 二维数组的行列区别
- C语言 二维数组的行列区别
- c语言中二维数组的问题
- C语言的二维数组模拟
- c语言中二维数组的传递
- C语言----二维数组的存储
- C语言中二维数组的问题
- 对C语言二维数组的理解
- c语言中二维数组的思考
- 二维数组的动态申请--c语言
- C语言二维数组的本质
- c语言二维数组的传递
- 二维数组的“鞍点”(C语言)
- 字符集和编码格式
- Javascript 获取当前页面的URL
- iOS android 下强制改变屏幕方向
- c++下午笔记
- 电路中各种VCC,VDD,VSS分别代表什么?
- C语言的二维数组的一些分析
- 用Python解压tgz文件
- 在Eclipse中使用JUnit4进行单元测试(实例篇)
- 马尔科夫随机场的基本概念
- 关于easyui中的样式应用
- 排序
- Python下使用tarfile模块来实现文件归档压缩与解压
- Single Number
- CSS居中