A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

最近赶进度没有时间写帖子,今天终于抽出时间来写这个帖子,这也是我欠大家的。
对于对于单单的数组  和 单单的指针相信大家应该都不会晕,但是两者结合起来就会让一大批刚刚学习的人蒙圈掉,归根结底就是有一些东西模糊不清,有很多写法到底有什么区别,下面我简简单单的谈一下我的理解:

1、数组
大家应该应该都不陌生,数组在内存中的表现就是一块连续的内存,每个元素存储的都是一样的数据类型,无论是基本的数据类型还是自定义的结构体类型。但是特点就是存储相同的结构。基本概念我在这里就不赘述了,相信大家都已经烂熟于心了。我主要说的就是大家比较迷惑的地方:
数组的名字,大家都知道是数组的第一个元素的地址,也称数组的首地址,根据这句话我们就可以得出结论:
int array[5];
他的array 和 &array[0] 是完全等价的。都是表示的数组的首地址。

数组元素的访问我们都是通过数组的下标进行访问的,那么我们就需要深入的去理解一下程序运行的时候,是怎么通过下标进行数组的访问的:
访问操作的就是在数组首地址array的地址向后移动  所存储数据类型 乘以 元素的个数。
以上面的例子举例:比如我们通过array[3]来取数组array的第四个元素,其实在内存中的操作就是在数组的首地址array的基础上向后移动数组所存元素所占字节(例子中是int这里是4)个字节 乘上 所取的个数(这里就是3),也就是在array的基础上向后移动4 * 3 = 12个字节,然后再取出后面4个字节的内容就是array[4]了。

从上面的理解了之后,就可以得出如下结论:
array[3] 和 *(array + 3) 和 [3]array 都是一个意思,也都是合法的,都是取出数组array的第四个元素。
我感觉上面的讲解,如果大家都明白了的话,应该就能解决单独的数组方面的问题了。如果没明白或者还有其他问题的话可以留言,我会为大家解答。

2、指针
指针就是一个内存地址,更多的理解可以理解成某个变量的地址。我们使用指针,就是来做内存的访问,二维数组这个帖子中我不进行讲解,如果需要我单开一个帖子,这里我主要讲讲指针和数组结合起来的使用。其实上面的话,根据我的理解就在看这里就很容易理解了:
int array[5];
int *arrayPtr = array;//arrayPtr = &array[0]是一样的
这里面用arrayPtr指向了数组的首地址,这样我们就可以用指针来进行数组的访问,如果只是进行数组的访问,其实和使用数组名是一样的(数组名就是指针):
比如我们还是取第4个元素,下面几种写法都是一样的:
arrayPtr[3];
*(arrayPtr + 3);
3[arrayPtr];

就因为数组名就是数组的首地址,所以使用指针和使用数组名字来取某个元素其实是一样的。但是也是有区别的:
数组名array是一个常亮,这个array是不能改变的,比如array ++;array += 1;array = array + 5等一切数组名在赋值运算符左边的操作都是不合法的,编译器是不会通过的。
相反指针arrayPtr是一个变量,他是可以放在赋值运算符的左边的,比如进行arrayPtr++; arrayPtr +=3等等都是完全合理的。

其实我要说的到这里就都差不多了,相信这个帖子能消除大部分的心理模糊心理啦,遇到这种问题就是需要多联系就知道啦,如果有什么问题欢迎大家多多的指正,大家相互交流,才能前进的更快。

52 个回复

倒序浏览
说的好,赞一个
回复 使用道具 举报

回复的真快。。神速。。。看来我写的还可以,有人看懂了
回复 使用道具 举报
没人看吗?还是写的不好,怎么没人反馈呢?
回复 使用道具 举报
{:2_30:}我感觉我又回了一点
回复 使用道具 举报
我就晕在指针上了,真心绕不过来
回复 使用道具 举报
学到一点
array ++;array += 1;array = array + 5等一切数组名在赋值运算符左边的操作都是不合法的
回复 使用道具 举报
写的真多
回复 使用道具 举报
、Z 中级黑马 2015-11-13 23:58:05
9#
可以的!
回复 使用道具 举报
早点休息了...
回复 使用道具 举报
江流石不动 发表于 2015-11-13 22:16
我感觉我又回了一点

嘿嘿,这个东西就都是慢慢积累才回学的越来越好的
回复 使用道具 举报
陌忆 发表于 2015-11-13 22:27
我就晕在指针上了,真心绕不过来

去理解一下,然后再去多看看相关的资料,然后就是多讨论一下,有啥不懂的可以找我一起探讨,我们一起进步撒
回复 使用道具 举报
触底反弹 发表于 2015-11-13 22:48
学到一点
array ++;array += 1;array = array + 5等一切数组名在赋值运算符左边的操作都是不合法的 ...

看来是认真看了,没有白白的写了,还以为没人看呢。、、、

点评

既然都点开帖子了,不认真看看说不过去啊  发表于 2015-11-14 01:39
回复 使用道具 举报

嘿嘿,都是为了方便大家的理解,写少了的话,就难理解了。。。。
回复 使用道具 举报

马上就休息了,哈哈,基本的休息 还是要保证的。。。。。
回复 使用道具 举报
自己再顶一贴,睡觉,大家多多交流,一起奔向高新。。。。
回复 使用道具 举报
整理的很细致,也全面,赞一个
回复 使用道具 举报
说的好,赞一个
回复 使用道具 举报
熊德玺 发表于 2015-11-14 01:27
整理的很细致,也全面,赞一个

嘿嘿,那以后我就多多的整理,和大家多多交流一起进步哈
回复 使用道具 举报
写的不错
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马