原创 一维数组和两维数组的关系

2008-9-24 01:00 2821 7 7 分类: MCU/ 嵌入式
hotpower 发表于 2008-9-24 00:47 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

楼主: 一维数组和两维数组的关系



一维数组:matr1[K]
char data matr1[6]=
{
  00,01,0x10,0x11,0x20,0x21
};

其中:matr1[k]
matr1[0]=0,matr1[1]=1,matr1[2]=0x10...matr1[5]=0x21

两维数组:matr2[M][N]
char data matr2[3][2]=
{
  {00,01},
  {0x10,0x11},
  {0x20,0x21}
};
其中:matr2[m][n]
matr2[0][0]=0,matr2[0][1]=1,matr2[1][0]=0x10...matr2[2][1]=0x21

它们的关系为:
k = m*N + n  (其中:k=0~K-1, m="0"~M-1, n="0"~N-1)

即当matr1和matr2的存储地址相同时,就有:
matr1[0]等同matr2[0][0]
matr1[1]等同matr2[0][1]
matr1[2]等同matr2[1][0]
matr1[3]等同matr2[1][1]
matr1[4]等同matr2[2][0]
matr1[5]等同matr2[2][1]

那么matr2[2][2]又是什么呢???
因为matr2定义为char data matr2[3][2]即M=3,N=2
那么matr2[2][2]即matr2[m][n].这里m=2,n=2(已经不满足n=0~N-1的条件)

所以matr2[2][2]应该属于非法访问,这在很多编译器编译时会报错误的!!!

但也有些编译器却可通过,实在是倒塌~~~

那么matr2[2][2]访问在何处???

根据一维数组和两维数组的关系:
k = m*N + n  (其中:k=0~K-1, m="0"~M-1, n="0"~N-1)

可知:
k = 2*2+ 2 = 6,即matr2[2][2]等同matr1[6].即matr1一维数组的第7个单元.

所以matr2[2][2]越界.


实际应用中,编译器都会先把两维数组用k = m*N + n转换为一维数组的.

而且可能还转换为指针.

所以在很多实际应用中,一维数组可能是不错的选择.


菜农不想加入以下21ic数组战斗贴,故写此贴以示自己的看法:


http://bbs.21ic.com/club/bbs/list.asp?Page=1&boardid=11&t=3099691

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条