直观理解C语言中指向一位数组与二维数组的指针

所属分类: 软件编程 / C 语言 阅读数: 78
收藏 0 赞 0 分享

一维数组和指针:
对于一位数组和指针是很好理解的:
一维数组名:
对于这样的一维数组:int a[5];  a作为数组名就是我们数组的首地址, a是一个地址常量 .
首先说说常量和变量的关系, 对于变量来说, 用箱子去比喻再好不过了, 声明一个变量就声明一个箱子,比如我们开辟出一个苹果类型的箱子, 给这个变量赋值就是把盛放苹果的箱子中放入一个实实在在的苹果, 这就是变量的赋值. 
而对于数组来说, 就是一组类型相同的箱子中,一组苹果箱子, 可以放入不同的苹果.
一维数组空间:
变量被声明后, 我们操作编译器, 对我们的C源文件进行编译, C在编译的时候 就会给我们的变量开辟相应的空间, 而对于数组而言, 开辟的空间是连续的.   我们把每个空间叫做存储单元, 每个空间都是有自己的编号, 就像我们现实生活中每户人家都有自己的一个门牌号一样, 系统数组空间地址是相连的, 并且我们的数组名就是一维数组首地址, 是一个地址常量.
指针:
既然数组的是占用连续的存储单元, 并且数组的首地址就是数组名, 我们可以通过指针变量来取出相应的地址.
指针变量, 就是这个箱子是专门存放其他箱子地址的. 我们可以把数组首地址给我们的指针变量. int a[7],*p; p=a;

201657162334919.jpg (396×188)

二维数组和指针的理解:

对于初学者对二维数组和指针的理解很模糊, 或者感觉很难理解, 其实我们和生活联系起来, 这一切都会变得清晰透彻.
我们用理解一维数组的思想来理解二维数组, 对于一维数组,每个箱子里存放的是具体的苹果, 二维数组,就是把一维数组中的内容中又存放了一系列的箱子, 这样就构成了二维数组.
这就像一辆火车, 火车有很多节火车厢, 每个火车厢里面有一趟座位, 那我们火车厢的编号和每个火车座位的编号就不同了.  例如int  a[3][4] ; 3节火车厢, 每个火车厢中有四个挨着的座位.  实际的座位的编号和我们的火车厢的编号这是我们要区分开的,  我们的火车厢编号就是a[0],a[1],a[2](从座位的角度上来看)
从外面看, 我们每节火车厢的地址, a+0,a+1,a+2, a就相当于一个行地址, 火车厢为单位的地址, a+1是跳到下一个车厢的首地址,  而a[0]就相当于是座位的首地址, a[0]+0就会跳到第0节车厢的第0个座位, a[0]+1就会跳到第0节车厢的第1一个座位.

201657162403111.jpg (721×435)

指针数组指向二维地址(座位的地址,实际地址):
建立一个指针数组来引用二维数组中的元素:int *p[3], a[3][2],i,j; 从各种可以看到p是一个数组名, 在定义时系统给他开辟3个连续的存储单元; 在这个前面加上*号表示, 数组的基本类型为int的指针类型. 我们可以通过for循环让这个数组里面的指针指向每排"座位"的首地址:

201657162430649.jpg (337×319)

这个数组可以理解为是"座位"地址类型数组.
而下面我们定义的这个数组: int a[3][2], (*prt)[2] 为行指针数组(火车车厢数组). 这样我们可以把每节"车厢的地址"放入到我们的行指针数组变量中了.
这样我们可以把a这个行地址常量赋值给行地址变量 p=a. p+1等价于a+1,等价于a[1] 当p指向数组的首地址时, 可以通过以下形式来引用p[i][j]:
(1) *(p[i]+j)
(2)*(*(p+i) +j ))
(3)(*(p+i))[j]
(4)p[i][j]
p是一个行指针变量, 而二维数组名a是一个行地址变量.
以上就是对二维数组和指针的理解.
        

更多精彩内容其他人还在看

用标准c++实现string与各种类型之间的转换

这个类在头文件中定义, < sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本
收藏 0 赞 0 分享

C++如何通过ostringstream实现任意类型转string

再使用整型转string的时候感觉有点棘手,因为itoa不是标准C里面的,而且即便是有itoa,其他类型转string不是很方便。后来去网上找了一下,发现有一个好方法
收藏 0 赞 0 分享

C/C++指针小结

要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区
收藏 0 赞 0 分享

C++ 类的静态成员深入解析

在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变量和成员函数使用规则,再给出一个实例来加深印象
收藏 0 赞 0 分享

C++类的静态成员初始化详细讲解

通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化
收藏 0 赞 0 分享

C++类静态成员与类静态成员函数详解

静态成员不可在类体内进行赋值,因为它是被所有该类的对象所共享的。你在一个对象里给它赋值,其他对象里的该成员也会发生变化。为了避免混乱,所以不可在类体内进行赋值
收藏 0 赞 0 分享

C++中的friend友元函数详细解析

友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样
收藏 0 赞 0 分享

static全局变量与普通的全局变量的区别详细解析

以下是对static全局变量与普通的全局变量的区别进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
收藏 0 赞 0 分享

C++ explicit关键字的应用方法详细讲解

C++ explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?下面就让我们一起来看看这方面的知识吧
收藏 0 赞 0 分享

教你5分钟轻松搞定内存字节对齐

随便google一下,人家就可以跟你解释的,一大堆的道理,我们没怎么多时间,讨论为何要对齐.直入主题,怎么判断内存对齐规则,sizeof的结果怎么来的,请牢记以下3条原则
收藏 0 赞 0 分享
查看更多