指针与数组

定义二维数组 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表示每一行的列数

原文地址:https://www.cnblogs.com/guoyujiang/p/11715404.html