一维数组: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转换为一维数组的.
而且可能还转换为指针.
所以在很多实际应用中,一维数组可能是不错的选择. 相关链接:https://bbs.21ic.com/club/bbs/list.asp?Page=1&boardid=11&t=3099691 |