三维数组和三维数组的指针本⽂主要给出三维数组和三维数组的指针的使⽤⽅法,对于⼆维数组和⼆维数组的指针的使⽤请参见:在讲述之前,还是先给出⼀段代码,之后,我将结合这⼀代码来跟⼤家⼀起学习三维数组和三维数组的指针的妙⽤。
#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
sizeof 指针
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 *号两边的括号不可去掉,否则就成了指针数组了
第⼀次写博客,有什么不对之处,望各位前辈达⼈,不吝指正……
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论