三维数组和三维数组的指针
来源:互联网 发布:史玉柱 知乎 编辑:程序博客网 时间: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[]) {
#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;
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<<((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 >>
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
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 *号两边的括号不可去掉,否则就成了指针数组了
第一次写博客,有什么不对之处,望各位前辈达人,不吝指正……
- 三维数组和三维数组的指针
- 关于三维数组和指针的测试
- 三维数组的指针操作
- 三维数组与指针
- 二维数组和三维数组
- 三维数组的理解
- 三维数组的应用
- 三维数组的运用
- 三维数组的初始化
- 简单的三维数组
- 三维数组
- 三维数组
- 三维数组
- 三维数组
- 三维数组
- 指针和数组(一维,二维,三维)以及野指针的避免
- 三维数组 多维数组 的声明 和添加
- 可自定义大小的二维数组和三维数组
- 逐步改善,设计优秀API
- 哈夫曼树
- Java实践之路(设计模式)——工厂模式(简单工厂)
- 单源最短路径(贪心算法)
- css列表 图片切换效果
- 三维数组和三维数组的指针
- 基础语法---J2SE
- 警告: No configuration found for the specified action: '/myNameSpace/login.action' in names
- C#中MessageBox用法大全
- 黑盒测试白盒测试
- 最近工作小结之eclipse
- 【C/C++】指针初始化
- android之视频播放器
- u盘知多少