黑马程序员技术交流社区

标题: 浅谈指针与数组(指针不会必须看) [打印本页]

作者: 正在输入中...    时间: 2015-11-12 23:21
标题: 浅谈指针与数组(指针不会必须看)
最近赶进度没有时间写帖子,今天终于抽出时间来写这个帖子,这也是我欠大家的。
对于对于单单的数组  和 单单的指针相信大家应该都不会晕,但是两者结合起来就会让一大批刚刚学习的人蒙圈掉,归根结底就是有一些东西模糊不清,有很多写法到底有什么区别,下面我简简单单的谈一下我的理解:

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等等都是完全合理的。

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

作者: 能不能行    时间: 2015-11-12 23:39
说的好,赞一个
作者: 正在输入中...    时间: 2015-11-12 23:42
能不能行 发表于 2015-11-12 23:39
说的好,赞一个

回复的真快。。神速。。。看来我写的还可以,有人看懂了
作者: 正在输入中...    时间: 2015-11-13 22:09
没人看吗?还是写的不好,怎么没人反馈呢?
作者: 江流石不动    时间: 2015-11-13 22:16
{:2_30:}我感觉我又回了一点
作者: 陌忆    时间: 2015-11-13 22:27
我就晕在指针上了,真心绕不过来
作者: 触底反弹    时间: 2015-11-13 22:48
学到一点
array ++;array += 1;array = array + 5等一切数组名在赋值运算符左边的操作都是不合法的
作者: HI耀玮    时间: 2015-11-13 23:01
写的真多
作者: 、Z    时间: 2015-11-13 23:58
可以的!

作者: sf1215225    时间: 2015-11-14 00:02
早点休息了...
作者: 正在输入中...    时间: 2015-11-14 00:56
江流石不动 发表于 2015-11-13 22:16
我感觉我又回了一点

嘿嘿,这个东西就都是慢慢积累才回学的越来越好的
作者: 正在输入中...    时间: 2015-11-14 00:57
陌忆 发表于 2015-11-13 22:27
我就晕在指针上了,真心绕不过来

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

看来是认真看了,没有白白的写了,还以为没人看呢。、、、
作者: 正在输入中...    时间: 2015-11-14 01:14
HI耀玮 发表于 2015-11-13 23:01
写的真多

嘿嘿,都是为了方便大家的理解,写少了的话,就难理解了。。。。
作者: 正在输入中...    时间: 2015-11-14 01:16
sf1215225 发表于 2015-11-14 00:02
早点休息了...

马上就休息了,哈哈,基本的休息 还是要保证的。。。。。
作者: 正在输入中...    时间: 2015-11-14 01:24
自己再顶一贴,睡觉,大家多多交流,一起奔向高新。。。。
作者: 熊德玺    时间: 2015-11-14 01:27
整理的很细致,也全面,赞一个
作者: normalwzh    时间: 2015-11-14 13:24
说的好,赞一个
作者: 正在输入中...    时间: 2015-11-14 23:34
熊德玺 发表于 2015-11-14 01:27
整理的很细致,也全面,赞一个

嘿嘿,那以后我就多多的整理,和大家多多交流一起进步哈
作者: 唐阿丽    时间: 2015-11-15 08:08
写的不错
作者: liuchuan_alex    时间: 2015-11-15 09:43
支持一下
作者: 正在输入中...    时间: 2015-11-16 23:26
唐阿丽 发表于 2015-11-15 08:08
写的不错

谢谢夸奖。。。。我会继续给大家出干货的。。。。。
作者: 仰望星空的猪    时间: 2015-11-16 23:43
学习了 赞一个
作者: chensc    时间: 2015-11-17 20:45
学习学习!
作者: 骑白马的唐僧    时间: 2015-11-17 22:48
mark,留看
作者: yufang1993    时间: 2015-11-17 23:05
默默点赞!!!!!!!!!!!
作者: 453702877    时间: 2015-11-17 23:26
我是路过,进来瞧瞧指针的。。。
作者: 正在输入中...    时间: 2015-11-17 23:36
唐阿丽 发表于 2015-11-15 08:08
写的不错

嘿嘿,以后会出更多的东西去和大家分享、、、、、
作者: Marlong    时间: 2015-11-18 10:46
过来支持一下
作者: 正在输入中...    时间: 2015-11-18 23:24
骑白马的唐僧 发表于 2015-11-17 22:48
mark,留看

是因为写的太长了没时间看?还是说没学习到这里呢?
作者: 超人不会飞啊    时间: 2015-11-19 00:10
收藏了收藏了收藏了
作者: chenxinju    时间: 2015-11-19 00:14
老师 说C 语言  "无指针 ,不自由.  把指针学好确实重要  现在感觉不容易
作者: 沐小妖mavs    时间: 2015-11-19 00:22
谢谢楼主分享
作者: 姚春林    时间: 2015-11-19 01:07
66666666!
作者: 骑白马的唐僧    时间: 2015-11-19 13:17
正在输入中... 发表于 2015-11-18 23:24
是因为写的太长了没时间看?还是说没学习到这里呢?

是那时候没时间啊。。每天学习太紧张,指针已经过去了,先把当天的稳固下
作者: 正在输入中...    时间: 2015-11-19 23:51
骑白马的唐僧 发表于 2015-11-19 13:17
是那时候没时间啊。。每天学习太紧张,指针已经过去了,先把当天的稳固下 ...

恩恩,学习方法不错、、每天的知识一定要掌握,等有时间的时候再去拓展。。。加油
作者: 打滚的橘子    时间: 2015-11-20 04:13
嘿,今天也学了指针和数组,因为有基础所以理解起来还好,就是放一块比较的时候有点晕。楼主还没往深了说,明儿我也是试试发个贴说指针,把晕的地方彻底弄清楚。
作者: 正在输入中...    时间: 2015-11-20 23:04
唐阿丽 发表于 2015-11-15 08:08
写的不错

666666。。。。。。。。。。
作者: 正在输入中...    时间: 2015-11-20 23:48
Marlong 发表于 2015-11-18 10:46
过来支持一下

我还有其他的帖子,可以去看看。。。。应该也挺不错的
作者: 骑白马的唐僧    时间: 2015-11-21 23:10
正在输入中... 发表于 2015-11-19 23:51
恩恩,学习方法不错、、每天的知识一定要掌握,等有时间的时候再去拓展。。。加油 ...

一起加油 一起加油
作者: Mr.Yan    时间: 2015-11-21 23:25
数组指针和指针数组确实有点绕,表示看了好久...
作者: 正在输入中...    时间: 2015-11-22 21:25
超人不会飞啊 发表于 2015-11-19 00:10
收藏了收藏了收藏了

要记得看呀。。。。只有看懂了 才是自己的。。。。。
作者: 刘邓诏初    时间: 2015-11-22 21:32
看到指针就头疼。。。。
作者: 夜神月No1    时间: 2015-11-23 13:05
正在输入中... 发表于 2015-11-14 01:24
自己再顶一贴,睡觉,大家多多交流,一起奔向高新。。。。

感觉还是需要有重点,感觉写的都是一样的字体,让看的人都没有兴趣去看了
作者: 一枚小刁民    时间: 2015-11-23 15:08
楼主幸苦了
作者: 正在输入中...    时间: 2015-11-23 23:42
夜神月No1 发表于 2015-11-23 13:05
感觉还是需要有重点,感觉写的都是一样的字体,让看的人都没有兴趣去看了 ...

好吧、、接受你的建议、、以后写帖子 好好排版。。。
作者: 夜神月No1    时间: 2015-11-24 07:41
正在输入中... 发表于 2015-11-23 23:42
好吧、、接受你的建议、、以后写帖子 好好排版。。。

其实我和你一样,也是用一样的字体,我自己看了一下都没兴趣看了
作者: 正在输入中...    时间: 2015-11-24 22:38
夜神月No1 发表于 2015-11-24 07:41
其实我和你一样,也是用一样的字体,我自己看了一下都没兴趣看了

好吧,看来是经验之谈呀、、、、我刚才看了一下,确实不太好
作者: 刘炼1993    时间: 2015-11-24 22:51
  谢谢你, 看了你的 我感觉 懂了那么一点点   
作者: Mr.Yan    时间: 2015-11-24 23:37
今天考试,都晕了。。。
作者: MrK    时间: 2015-11-25 00:16
路过帮顶。。。。。。。。。。。。。。。。
作者: 能不能行    时间: 2015-11-25 22:06
牛逼......




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2