萌新们,数组、指针,还是傻傻分不清楚吗?

萌新们,数组、指针,还是傻傻分不清楚吗?

大家好,我是你们的好朋友,童无敌!今天我们来谈谈关于萌新们最为头疼的问题之一,那就是数组与指针变量之间到底有什么纠缠不清的恩恩怨怨!哈哈哈……
废话不多说,咱们步入正题!
首先咱们再讲数组与指针变量的问题之前,我们对物理内存是要有最基本,最初步且比较快乐的认识的!再初入坑的时候我们可以先把内存理解为一大片的广袤天地,在这块广袤的天地之上呢,是以一个单位一个单位被划分好了的(也即划分为一个字节一个字节的)。这样呢,我们就可以把内存想像成为网格状,也即每个网格的大小为一个字节的大小,并且每个网格都是有地址的(可以理解为每个网格都是有编号的,编号即为地址),并且地址是从0开始的。好了,有了这些的认识就足以让你跟着无敌的思路去弄清楚数组与指针的恩怨了!
数组,大家都应该知道是若干个相同类型的并且连续排列在一起的存储空间(网格)。而指针变量呢,则是一个保存别的内存空间(网格)的地址的一个内存空间(网格)。我知道大家迷的应该是数组名!
大家可以想一下,数组是若干个类型相同的连续排列在一起的存储空间,那这个数组是不是也是有地址的呢?答案当然是肯定的!那数组的地址怎么表达出来呢,我现在告诉大家,数组的地址就是首元素的地址,也即第0个元素的地址,无论这个数组有多少个元素,则这个数组的地址就为第0个元素的地址。现在我们知道了第0个元素的地址就是整个数组的地址,但是问题还没解决呀!这个地址怎么表达出来呢?那就是数组名,数组名就是第0个元素的地址,也即整个数组的地址,并且数组名不是一个指针变量,而是一个指针常量,也即数组名就是数组的地址值!是不是很惊讶?因为数组名的外表就是一个变量呀!例如:int a[10];a是一个类型为int,元素个数为10的数组的名字。看看吧,数组名的外表多么像一个变量呀!但是它确确实实就是一个毋庸置疑的指针常量!为什么会这样呢?无敌也不知道!无敌想也许这就是K&R设计C语言的艺术吧!现在我们对数组有了一定的了解了,现在数组a就已经在那了,在内存上快乐的存在着!
现在我们讲指针!其实我非常的建议大家在读指针的时候一定要多多注意。有的时候不是我们学不会,而是老师不会教或者书本上的字句不说人话!一定要把指针常量与指针变量区分开,并且说清楚!有的老师或者课本总是说的那么含糊其辞,这也是萌新们迷糊的主要原因之一!指针常量也即指针变量里的内容也即指针变量的值,或者说某个内存空间的地址值。而指针变量呢,就是指保存某个内存空间的地址的空间,也即指针变量。指针变量保存内存空间的地址,普通变量保存普通的数值。
现在我们讲数组与指针变量的关系!现在数组a已经在内存上了,数组名a是数组的第0个元素的地址,也即整个数组的地址。数组名是一个指针常量,也即数组的地址值,因为是常量所以只能做右值而不能做左值,也不能做++或−−。如果我们现在定义一个指向整型的指针变量,并且将数组名的值赋值给这个指针变量,则这个指针变量也就指向了这个数组,则也就可以用与数组名相同的手段去处理这个数组了,如用下标运算符访问数组的各个元素。因为指针变量是变量所以是可以做左值的,并且可以做++或做−−。
数组名与指针变量的区别:

  1. 数组名是常量,故不能做左值而只能做右值,而指针变量既可以做左值又可以做右值。
  2. 数组名不能做++或−−,而指针变量可以。
  3. 函数调用,上传一个数组名,则函数使用指针变量接收数组名的值。
  4. 数组名可以和整型做有意义的加减,指针变量也可以。
    萌新们,读完这篇文章还迷糊吗?
    好啦!今天就先说到这里啦 !再见再见……
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值