定义二维数组 a[m][n]
直接寻址 = 间接寻址
a[i][j] = *(*(a+i)+j)
说明:
抽象意义:
a+i:二维平面内,第i行的地址
*(a+i)+j:行内的第j个元素的地址 #找到元素的地址,用*间接寻址
逻辑意义:
a+i 第i行的首地址,即a[i],意义上不同于&a[i][0],但地址相同,即 行的地址=行首元素地址
*(a+i)+j 表示第i行的第j各元素的地址,即&a[i][j]
*(*(a+i)+j)即为间接寻址,表示a[i][j]
地址计算公式:
Loc(i, j) = a0 + (i*n + j)*sizeof(int) #按行存储,多数情况
Loc(i, j) = a0 + (j*m + i)*sizeof(int) #按列存储,少见
说明:
1、a0表示首元素地址&a[0][0],此公式可用于计算a[i][j]的地址(base16)
2、特殊情况下,间接寻址方式可以在此公式的基础上使用,转 间接寻址
1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 int ib[3][4]; 7 cout<<"ib="<<ib<<endl; 8 cout<<"----&ib[i][j]---"<<endl; 9 for(int i=0; i<3; i++) 10 { 11 for(int j=0; j<4; j++) 12 cout<<&ib[i][j]<<" "; 13 cout<<endl; 14 } 15 cout<<"----ib+i----"<<endl; 16 for(int i=0; i<3; i++) 17 cout<<"ib+"<<i<<"="<<ib+i<<endl; 18 cout<<"----*(ib+i)----"<<endl; 19 for(int i=0; i<3; i++) 20 cout<<"*(ib+"<<i<<")="<<*(ib+i)<<endl; 21 cout<<"----*(ib+i)+j----"<<endl; 22 for(int i=0; i<3; i++) 23 { 24 for(int j=0; j<4; j++) 25 cout<<"*(ib+"<<i<<")+"<<j<<"="<<*(ib+i)+j<<" "; 26 cout<<endl; 27 } 28 cout<<"Loc(i,j)公式计算:(错误的方法)"<<endl;//错误的寻址方法 29 for(int i=0; i<3; i++) 30 { 31 for(int j=0; j<4; j++) 32 cout<<*(ib+(4*i+j)*sizeof(int))<<" "; 33 cout<<endl; 34 } 35 return 0; 36 }
同理:
定义三维数组 a[p][m][n]
a[i][j][k] = *( *( *(a+i) +j) +k)
说明:
抽象意义:
a+i:在空间内,表示第i个面的地址
*(a+i)+j:进入面内,表示第j行的地址
*(*(a+i)+j)+k:进入行内,表示行的第k个元素的地址 #找到元素的地址,用*间接寻址
逻辑意义:
a+i 表示第i个“面”的地址,即 a[i]
*(a+i)+ j 得到第i个“面”的第j“行”的地址,即a[i][j]
*(*(a+i)+ j)+ k 得到第i个“面”的第j“行”的第k个元素的地址,即&a[i][j][k]
*(*(*(a+i)+j)+k) 得到第i个“面”的第j“行”的第k个元素,即a[i][j][k]
理解:
三维数组是一种多个平面组成的特殊的二维数组
A[p][m][n] = p * a[m][n]
抽象意义上,p在空间上表示前后有几个面,m表示每一个面上的行数,n表示每一行的列数