理解C语言二维数组名
欢迎关注我的博客:小鱼的技术博客
最近在研究二维数组,发现如果单独理解数组名的Array的含义,还真不太好理解。比如现在有一个二维数组:
int Array[2][2] = { {1, 2}, {3, 4} };
这个二维数组里包含了两个一维数组,分别是{1,2},{3,4},这个好理解,但是对于Array和Array + 1这两种写法,该怎么理解呢?这篇文章我就说说我自己的心得吧。
先上一段简单的代码:
#include <stdio.h>
//编译器名: TDM-GCC 4.9.2 32-bit Release
//运行平台:windows xp 32bit int main(void)
{int Array[2][2] = { {1, 2}, {3, 4} };printf("Array的值是%p, Array + 1的值是%p\n", (void *)Array, (void *)(Array + 1));printf("Array[0][0]的地址是%p, Array[1][0]的地址是%p\n", (void *)(&Array[0][0]), (void *)(&Array[1][0]));return 0;
}
运行结果如下:
从运行结果可以看到,Array的输出值是,Array + 1的输出值是,两者相差了8个字节。
1.理解二维数组名:Array
对于二维数组Array这个名字,一般的教材告诉我们,Array是第一个元素的地址。怎么来理解这句话呢?
如果从我们人脑的角度来理解Array,最形象的理解就是Array是一个大集合,它包含了4个数字:1、2、3、4。用一个图来表示,就像这样子:
![](/assets/blank.gif)
但是电脑可不会像我们人脑来看待Array。从电脑自己的角度来看,它会看到Array标记的内存地址段里有两个一维数组,却看不到每个一维数组里的数字。用一个图来表示,就像这样子:
也就是说,电脑会认为Array的基本单位是一维数组,而不是一个个具体的数字,理解这个很重要。那么再回过头来看教材的这句话“二维数组名Array是第一个元素的地址”,现在电脑认为Array的元素是一维数组,那么第一个元素就是第一个一维数组{1,2},第一个元素的地址就是第一个一维数组{1,2}的地址。
同里,对于Array + 1,由于电脑认为Array的元素是一维数组,那么Array + 1就是第二个元素{3,4}的地址。千万不要认为Array + 1就跑到数字“2”去了。记住,电脑处理Array是按照一位数组为单位处理的,不是按照单个数字1、2、3、4来处理的,所以我说电脑认为Array的基本单位是一维数组这句话很重要。而且从运行结果来看,Array + 1的值与Array相差了8个字节,也说明了Array移动是以一维数组为单位移动的。
2.计算Array的值
第1点中,我说过Array是第一个元素的地址,而第一个元素是一个一维数组{1,2},那么Array的值就是{1,2}这个一维数组的地址。那么{1,2}的地址是多少呢?当然不是“1”的地址就是“2”的地址咯,你不会拿“2”的地址来作为一维数组{1,2}的地址吧?现在就恍然大悟了,一维数组{1,2}的地址就是首元素“1”的地址,那么Array的值也就是&Array[0][0]的地址啦,跟运行结果一样!
同里,Array + 1的值是第二个元素的地址,而第二个元素是一维数组{3,4},而一维数组{3,4}的地址是首元素“3”的地址,所以Array + 1的值就是&Array[0][0]。
3.总结
本文这是我对Array和Array + 1的意思的一点心得。文字描述没有教材上那么严谨,因为严谨了不利于理解抽象的概念。
关于二维数组还有一些写法,像Arrya[0],*Array,*Array[0]等等,这些写法又代表什么意思,待续!
欢迎关注我的C语言教学微博:http://weibo.com/520JDH
理解C语言二维数组名相关推荐
- c语言——用二维数组名对二级指针赋值
用二维数组名对二级指针进行赋值后,二级指针的指针运算操作是与二维数组的指针运算有区别的.通过下面的例子你将了解到二维数组与二级指针进行指针运算的本质区别. char array[3][4]={&quo ...
- c语言二维数组表示坐标,c语言多维数组地址的表示方法
c语言多维数组地址的表示方法 导语:我们知道数组名就是指针常量.下面让我们了解一下多维数组的地址表现方法. 设有整型二维数组a[3][4]如下: 0 1 2 3 4 5 6 7 8 9 10 11 设 ...
- C语言中二维数组名与数组地址、首行地址、首行首元素地址关系与区别详解(初学者必须掌握)
C语言作为很多大学理工科都会学习的语言,作为一种编程入门语言. 但是相对于其他高级编程语言来说相对是比较难,尤其是指针,不知道有多少莘莘学子都是因为它,从C语言入门到放弃. 想当年,笔者在大一学习C语 ...
- c语言二维数组 ppt,C语言二维数组与指针.ppt
C语言二维数组与指针.ppt 好好考,全国计算机等级考试 二级C语言,第12讲 二维数组与指针,二维数组的定义 数组元素的引用及初始化 二维数组和指针 二维数组名和指针数组作为实参 二维数组程序举例 ...
- [黑马IOS自学第五篇]C语言二维数组,排序法学习
一.补充关键字char,short关键字 /* 1.改变整型变量占用的存储空间 int short long long long 改变一个数的符号 signed unsigned */ <spa ...
- C语言二维数组的四种遍历方式
二维数组的四种遍历方式: a[i][j] *(a[i]+j) *(*(a+i)+j) *(&a[0][0]+i*n+j) 1.a[i][j] : 这种方法是最基本的方式. 2 ...
- c语言定二维义数组,C语言二维数组超细讲解
用一维数组处理二维表格,实际是可行的,但是会很复杂,特别是遇到二维表格的输入.处理和输出. 在你绞尽脑汁的时候,二维数组(一维数组的大哥)像电视剧里救美的英雄一样显现在你的面前,初识数组的朋友们还等什 ...
- 深入理解C/C++二维数组
深入理解C/C++二维数组 前言 本来以为自己对二维数组的理解还可以,没感觉有什么,但是今天小伙伴问了一个问题感觉迷惑了好久,于是决定细致的记录一下,一步一步的探究各种关于二维数组的问题,巩固基础. ...
- C++二维数组名的再探索
#include <iostream>int main() {int d2a[3][4] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };//输出 0 ...
最新文章
- 9岁去读博!全球最年轻的大学毕业生火了:4岁上小学,8岁进入荷兰“中科大”,智商145...
- Android开发--BroadcastReceiver介绍1
- hdu 5621 KK's Point(数学,推理题)
- ZH奶酪:Ubuntu 14.04配置LAMP(Linux、Apache、MySQL、PHP)
- iis 7 安装php环境_iis7配置php环境图文教程
- mysql没有group by_MySQL:不在GROUP BY中
- 归并排序验证性实验_性能优化技巧:有序归并
- 史上最全最新手机号码号段大全
- 【技术分享】select下拉框option默认选中(php模板渲染)
- 滑动拼图验证码的原理和破解方法~
- 人工智能:python 实现 第十章,NLP 第一天 入门介绍及使用stemming还原词汇
- 钉钉视频下载方法地瓜网络钉钉视频下载器
- 关于Win10已设置默认打开方式的清除方法
- 13 年的 Bug 调试经验总结(来自蜗牛学院)
- 如何简单的抓取网站数据
- 安装pycrypto,windows10,全解
- Prometheus架构与实践分享
- 计算机课怎样制作ppt 课件ppt,计算机多媒体课件制作.ppt
- HTML5期末大作业:零食官网网站设计——美食零食官网(6页) html网页制作期末美食作业成品_小吃类网页设计期末作业
- 布里斯托大学计算机科学专业排名,2019上海软科世界一流学科排名计算机科学与工程专业排名布里斯托大学排名第101-150...
热门文章
- 阿里云Centos搭建h5ai(逃
- 英国约克大学留学生本科没有毕业申请硕士你还在犹豫吗
- 教程篇(6.0) 13. 数据泄露预防 (DLP) ❀ FortiGate 安全 ❀ Fortinet 网络安全专家 NSE 4
- python的tkinter库的安装,Python2 Python3的Tkinter库的安装
- 【进制转换】0x7FFFFFFF 是 long int 的最大值
- fgetc与fputc
- iOS基础-UIView
- android xwalkview 截屏,如何在Cordova中为你的应用创建屏幕截图
- 向Windows Phone 7手机部署应用程序
- [高考数学]端点效应