网站首页 > 技术文章 正文
本文原创,转发请著名作者和来源。
最近在研究C语言二维数组,发现如果单独理解数组名的Array的含义,还真不太好理解。比如现在有一个C语言二维数组:
int Array[2][2] = { {1, 2}, {3, 4} };
这个二维数组里包含了两个一维数组,分别是{1,2},{3,4},这个好理解,但是对于Array和Array + 1这两种写法,该怎么理解呢?这篇文章我就说说我自己的心得吧。
先上一段简单的C语言代码:
#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.理解C语言二维数组名:Array
对于二维数组Array这个名字,一般的C语言教材告诉我们,Array是第一个元素的地址。怎么来理解这句话呢?
如果从我们人脑的角度来理解Array,最形象的理解就是Array是一个大集合,它包含了4个数字:1、2、3、4。用一个图来表示,就像这样子:
但是计算机可不会像我们人脑来看待Array。从计算机自己的角度来看,它会看到Array标记的内存地址段里有两个一维数组,却看不到每个一维数组里的数字。用一个图来表示,就像这样子:
也就是说,计算机会认为Array的基本单位是一维数组,而不是一个个具体的数字,理解这个很重要。那么再回过头来看C语言教材的这句话“二维数组名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移动是以一维数组为单位移动的。
欢迎关注本人微博与微信:C语言编程技术分享
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的意思的一点心得。文字描述没有C语言教材上那么严谨,因为严谨了不利于理解抽象的概念。
关于二维数组还有一些写法,像Arrya[0],*Array,*Array[0]等等,这些写法又代表什么意思,待续!
猜你喜欢
- 2024-09-21 你完全掌握了C语言数据类型——数组了吗?带你了解二维数组!
- 2024-09-21 C语言结构体,如何定义结构体数组?linux C第62讲
- 2024-09-21 C语言 一维数组的定义和使用(c语言中的一维数组的定义)
- 2024-09-21 「初识C语言」二维数组(c语言二维数组写法)
- 2024-09-21 【C语言】(4)数组(c语言中数组的用法)
- 2024-09-21 【C语言】数组(c语言数组和指针的关系)
- 2024-09-21 一文解读清楚C语言动态数组(c语言如何使用动态数组)
- 2024-09-21 C/C++编程知识分享:C++ 手把手教你实现可变长的数组
- 2024-09-21 什么是 Python 中的数组,它与列表有何不同?
- 2024-09-21 C语言系列_4:一文让你明白C语言数组
- 1514℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 568℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 509℃MySQL service启动脚本浅析(r12笔记第59天)
- 486℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 485℃启用MySQL查询缓存(mysql8.0查询缓存)
- 466℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 446℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 443℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)