三维数组和三维数组的指针

来源:互联网 发布:史玉柱 知乎 编辑:程序博客网 时间:2024/04/29 14:21
本文主要给出三维数组和三维数组的指针的使用方法,对于二维数组和二维数组的指针的使用请参见:
http://apps.hi.baidu.com/share/detail/6320035
在讲述之前,还是先给出一段代码,之后,我将结合这一代码来跟大家一起学习三维数组和三维数组的
指针的妙用。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define unsigned char u8
#define ROW_MAX     10
#define COLUMN_MAX     6
#define GRID_MAX_SIZE     10
using namespace std;

int main(int argc, char *argv[]) {
      //定义一个三维数组
     char arr[ROW_MAX][COLUMN_MAX][GRID_MAX_SIZE];                               //P0
     //定义一个指向数组的指针parr
     char (*parr)[COLUMN_MAX][GRID_MAX_SIZE];
    
     char tmp[10];
     int i,j;
      //给三维数组赋初值
     for(j=0;j<ROW_MAX;j++)
     {
          for(i=0;i<COLUMN_MAX;i++)
          {
               memset(tmp,0,sizeof(tmp));
               sprintf(tmp,"%d.%d",j,i);
               strcpy(arr[j][i],tmp);
          }
     }
    //打印三维数组的值
     for(j=0;j<ROW_MAX;j++)
     {
          for(i=0;i<COLUMN_MAX;i++)
          {
               cout<<arr[j][i]<<" ";
          }
          cout<<endl;
     }
    
     cout<<endl;

     parr=arr;
     //将数组的指针指向三维数组
     
     
     
                                                //P1

    
     for(i=0;i<5;i++)
     {
          cout<<arr[i]<<"\t"<<parr++<<"\t"<<(parr+1)<<endl;
              //P2

     }
    
     parr=arr;
     for(i=0;i<COLUMN_MAX;i++)
     {    
          cout<<parr[i]<<"\t";                                                                    //P3
          cout<<*parr[i]<<"\t";
     
     
     
     
     
                                            //P4

          cout<<**(parr+sizeof(char)*10*i)<<"\t";                                  //P5
          cout<<((char (*)[GRID_MAX_SIZE])parr)[i]<<"\r\n";               //P6
     }
     cout<<endl;
     parr++;                                                                                               //P7
     for(i=0;i<COLUMN_MAX;i++)
     {
          //cout<<**(parr+sizeof(char)*10*i)<<" ";
          cout<<((char (*)[GRID_MAX_SIZE])parr)[i]<<" ";                      //P8
     }
     cout<<endl;
    
     return 0;
}


运行结果:

0.0 0.1 0.2 0.3 0.4 0.5
1.0 1.1 1.2 1.3 1.4 1.5
2.0 2.1 2.2 2.3 2.4 2.5
3.0 3.1 3.2 3.3 3.4 3.5
4.0 4.1 4.2 4.3 4.4 4.5
5.0 5.1 5.2 5.3 5.4 5.5
6.0 6.1 6.2 6.3 6.4 6.5
7.0 7.1 7.2 7.3 7.4 7.5
8.0 8.1 8.2 8.3 8.4 8.5
9.0 9.1 9.2 9.3 9.4 9.5

0x22fcd2        0x22fcd2        0x22fd0e
0x22fd0e        0x22fd0e        0x22fd4a
0x22fd4a        0x22fd4a        0x22fd86
0x22fd86        0x22fd86        0x22fdc2
0x22fdc2        0x22fdc2        0x22fdfe
0x22fcd2        0.0     0.0     0.0
0x22fd0e        1.0     9.5     0.1
0x22fd4a        2.0     O       0.2
0x22fd86        3.0     P       0.3
0x22fdc2        4.0     r       0.4
0x22fdfe        5.0     \       0.5

1.0 1.1 1.2 1.3 1.4 1.5


<< Program finished: exit code: 0 >>
<< Press enter to close this window >>


结果分析:

P0:
定义一个三维数组arr,可以想像这是一个二维的表格,行数为10,列数6,每个单元格中都用来存放一个字符串,
字符串的最大长度为10。同时,定义一个指向数组的指针parr(有别于指针数组)。

为了更好好表现多维数组和数组的指针的使用与及二者之间的关系,我给数组进行了赋值。

P1:
将数组的指针指向指针的数组,这正是数组的指针的作用,下面将展示数组的指针的妙用

P2:
这句代码是用来展示数组的指针加1的情况。
0x22fcd2        0x22fcd2        0x22fd0e
0x22fd0e        0x22fd0e        0x22fd4a
……
从上面运行结果,显而易见,数组的指针加1时地址偏移量并不是1,而是定义数组的指针时数组的大小,在这里,
char (*parr)[COLUMN_MAX][
COLUMN_MAX
];
所以,偏移量为COLUMN_MAX*COLUMN_MAX*sizeof(char)=60=0x3c
这里的偏移量跟arr[i]之间的arr[i+1]的地址偏移是一样的

P3~P7:
用于展示怎样通过数组的指针来访问多维数组
0x22fcd2        0.0     0.0     0.0
0x22fd0e        1.0     9.5     0.1
0x22fd4a        2.0     O       0.2
0x22fd86        3.0     P       0.3
0x22fdc2        4.0     r       0.4
0x22fdfe        5.0     \       0.5
从以上的运行结果,可见
parr[i],为每行的首地址,即arr[i]
*
parr[i],指向每行的第一个单元格,即arr[i][0]
**(parr+sizeof(char)*10*i),跟以上相似,也是访问某一行的第一个单元格
在这里,因为,单元格是一行一行偏移的,所以要访问某一行中的非首个单元格,则要对
parr作一些转换,如下所示:
(char (*)[GRID_MAX_SIZE])parr
上面这一句是将parr,强制转换成一维数组的指针,并且数组的大小为sizeof(char)*GRID_MAX_SIZE,
此时,parr++的偏移就是sizeof(char)*GRID_MAX_SIZE,而不是COLUMN_MAX*COLUMN_MAX*sizeof(char)=60=0x3c
故通过((char (*)[GRID_MAX_SIZE])parr)[i]可以访问一行中的任一个单元格,相当于arr[j][i]的作用。

注意:P0和P6 *号两边的括号不可去掉,否则就成了指针数组了

第一次写博客,有什么不对之处,望各位前辈达人,不吝指正……

原创粉丝点击