多维数组的理解
要清楚的理解多维数组,需要先理解指针的算术运算和数组名的含义。
1、指针的算术运算
指针的算术运算与普通的类型的算术运算是不同的,编译器会在指针的算术运算的过程中自动乘以sizeof(type),如int p=1;p=p+2;则p=3;而int *p; (假如p指向的初始地址位2000),那么p=p+2;实际上指向的是2000+2*sizeof(int),32位系统下的结果为2008。
2、多维数组名字的理解
对于数组名大家都知道可以理解为指针,可究竟这个指针指向的内容是什么呢?这个我没法直接说清楚,直接对着例子说吧
如:定义了下面的一个三维数组,那么num当做指针的话它指向的内容是什么呢,其实它可以理解为只有三个元素的一维数组,num[3]={a[4][5],b[4][5],c[4][5]};而a,b,c为三个4行5列的二维数组a[4][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20}};
b[4][5]={{21,22,23,24,25},{26,27,28,29,30},{31,32,33,34,35},{36,77,88,39,40}}
c[4][5]={{41,42,43,44,45},{46,47,48,49,50},{51,52,53,54,55},{56,57,58,59,60}}
int num[3][4][5]={{{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20}},
{{21,22,23,24,25},{26,27,28,29,30},{31,32,33,34,35},{36,77,88,39,40}},
{{41,42,43,44,45},{46,47,48,49,50},{51,52,53,54,55},{56,57,58,59,60}}};
综上,num是一个指向{{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20}}元素的指针,而不是指向1的指针,虽然他们的地址相同,但是num+1可就不同了,根据对指针运算的理解,num+1之后num的值应为:原地址值+sizeof(num),如果上述分析正确的话,执行num+1之后,num应为:原地址值+sizeof(int)*4*5,即32为系统下num+1的值应比num的值多80,而不是4,下面通过程序验证下:
#include<iostream>
using namespace std;
int main()
{
int num[3][4][5]={{{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20}},
{{21,22,23,24,25},{26,27,28,29,30},{31,32,33,34,35},{36,77,88,39,40}},
{{41,42,43,44,45},{46,47,48,49,50},{51,52,53,54,55},{56,57,58,59,60}}};
int addr1=(int)num;
int addr2=(int)(num+1);
cout<<addr1<<endl<<addr2<<endl;
return 0;
}
理解上面的内容就可以对多维数组进行操作了,如定位到23这个元素,首先要先通过*(num+1)定位到{{21,22,23,24,25},{26,27,28,29,30},{31,32,33,34,35},{36,77,88,39,40}},然后在对其*()即*(*(num+1))定位到{21,22,23,24,25},然后在*(+2)即*(*(*(num+1))+2)定位到23。
3、用数组名作为一维指针去操作多维数组
其实多维数组只是为了方便程序员编程,而设定的,在内存中多维数组就是一个一维数组,它是按照从左到右一个元素一个元素线性排列的,如上述num数组中的元素就是按照从1到60排序的。使用时需要先找到多维数组中第一个元素的地址,然后将其赋值给一维指针,如int *p=&num[0][0][0];或int *p=num[0][0];
#include<iostream>
using namespace std;
int main()
{
int num[3][4][5]={{{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20}},
{{21,22,23,24,25},{26,27,28,29,30},{31,32,33,34,35},{36,77,88,39,40}},
{{41,42,43,44,45},{46,47,48,49,50},{51,52,53,54,55},{56,57,58,59,60}}};
int addr1=(int)num;
int addr2=(int)(num+1);
cout<<addr1<<endl<<addr2<<endl;
cout<<*(*(*(num+1))+2)<<endl;
int *p=&num[0][0][0];
int *q=num[0][0];
cout<<*(p+22)<<endl;
cout<<*(q+22)<<endl;
return 0;
}
- 写入Ring Buffer
- Enterprise Library 4 缓存快速入门
- Enterprise Library 4 缓存应用程序块的设计
- 让WordPress 在RSS 中Feed 输出支持“More”标签
- WordPress文章版权保护:复制文字自动添加版权信息
- 替换WordPress 自带默认的 jQuery库, jQuery库页脚加载
- Enterprise Library 4 数据访问应用程序块
- 替换EnterPrise Library 4.0 缓存应用程序块的CacheManager
- Enterprise Library 4.0缓存应用程序块
- 通过.htaccess 让WordPress 的上传文件夹更安全
- asp.net 性能调较
- 零基础学习大数据,搭建Hadoop处理环境
- 为你的WordPress 博客开启两步验证功能(技术支持:谷歌)
- 为你的WordPress 博客开启两步验证功能(技术支持:谷歌)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法