Author:Challenge_C_PlusPlus
Blog: http://blog.csdn.net/Challenge_C_PlusPlus
(转载请注明出处)
数组与指针,C语言里老掉牙的问题,为什么那么多新手还是搞不懂,甚至一些用了C语言多年的人也模棱两可。今天我也来讲讲。
1.先说指针
啥是指针?大家应该都晓得变量(或称“对象”),其实,指针就是一个变量而已,不晓得大家为什么把它搞得那么麻烦,尤其是有些书里讲的,这里我不得不插一句,国内出的那一堆C语言书,我真的觉得就是一堆垃圾!(国内很多出书的人不负责任,某某高校老师出了本书,你晓得他杂出的吗?叫几个学生你一章我一节拼出来的,当然,我不能以篇概全,肯定有认真写书的人。但是我敢肯定,很多还是糊弄的。)扯远了,还说我们的指针。
指针就是一个变量,比如 int a=1;int *pi=&a; 其中pi就是一个指针,我们也可以说pi是一个变量,该变量的类型是 int *。就是说这个变量对应的内存空间里放的是一个值。而这个值有点特殊而已,它是一个地址,如图所示:(注意,这里的图仅是一个示意图而已,指针和整型在32为系统里都是占4个字节,这里只用了一个字节表示,示意而已!)
变量pi与变量a除了对应内存单元里存放的内容类型不一样外,没有啥子区别。
现在大家明白了吗?指针就是一个变量而已!这是指针第一个要理解的地方。
接下来我要先插一句,什么叫变量?拿变量a来说,变量a就是上图a指向的那个内存单元,这里说内存单元,它本身有两个属性:内存单元的内容和内存单元的地址,这两个属性还分别有个专业术语,前者叫右值,后者叫左值。这样说,你明白了吗?变量既不是指内存单元的内容,也不是指其地址,而是指的这个内存单元而已。有点混,对吧,看例子:
a=1;//用的a的左值,即a的地址,有了地址,cpu就晓得将1放到a这个单元对应地址的 //内存单元里。
int b=a;//用的a的右值,即a的内容,因为我们只关心a的内容,把它给b即可。
如果这个地方大家有不明白的就pm我,或者大家认为我说的不对,也可以指出哈!建议大家反汇编一下就一清二楚了。
理解指针还需要理解一点,指针(变量)与普通变量唯一的区别是它有一个特别的用法:
*pi在变量前边加个*号,这样*pi就表示变量a了。什么意思?就是说 *pi 就等于a,a就等于*pi了。你就把*和pi的组合看成一个字符串就是了。*pi 等于a这一点有点像c++里的引用(别名),现在你就把*pi当成a的别名把,a能做的它都能做!明白了吗?
总结一下:指针难吗?难个P啊,记住两点就全懂了:
1:指针就是一个变量;
2:指针变量前边加个*号就相当于该指针变量里存放的地址对应的那个单元。
拿这两点你去套指针的指针,指针的指针的指针啊,神马都是浮云,一样一样滴!还是那句不懂或怀疑其正确性可以pm我哈!
2.接下来干掉数组
数组是神马?就是上边提到的变量,多个连续存放就是数组了。我对数组从不清楚到了解也经历了一个曲折的过程。我个人认为数组有两点不易理解,理解了这两点数组不过尔尔。
哪两点?
1:数组名是否等于指针?
2:“sizeof(数组名)”等于什么与“数组名+常数”的值是什么?
是的,搞懂这两点,就搞懂了数组。
首先,数组名不等于指针!原因看下图:
我们说,一个变量代表的既不是它的内容也不是它的地址,其实,这里的a也是一个变量,对!数组也是一个变量,它的类型是int [5],它对应的单元是#1到#5这几个单元的整体。
a本身仅是一个符号而已,它自身不需要一个内存单元来存放。这就是我们说的数组不等于指针!我们说数组的地址等于第一个元素的地址,当然了!a代表的整个大单元(从#1到#5的地址就是#1的地址,它与#1的地址是一个值的嘛)。正是,这一点,导致很多国内的垃圾书说数组a就是数组的第一个单元!再次鄙视一下!(对于*a为什么取出的是第一个单元的内容,我想应该是编译器处理的,把a转换为指向第一个元素的指针,这一点有待考证!)
下面解释第二点。sizeof(数组名)等于什么,看了上图,你也应该明白了,为什么sizeof(数组名)等于整个大空间的总字节数了把。因为sizeof(数组名)=sizeof(数组变量类型),注意是数组变量类型不是数组元素类型哦。拿数组a来说,数组变量是a,它的类型是int[5]
,而数组元素类型是int。这下明白了把。
还有一个棘手的问题就是 数组名+常数,地址是如何增长的。其实是这样的。
int a[5][5][5]; a的地址假设为1,sizeof(int)=4;//32位系统
则a+3代表的位置的地址是多少?当这样使用时,常数3是以数组元素为单位的。int a[5][5][5] 的数组元素是啥啊,是int[5][5]啦,判断方法就是 去掉数组名和它紧紧挨着的那个中括号就是了。故a+3的地址等于1+3*(sizeof(int[5][5]))=301。C语言里的数组就是这样定义的,实际上没有什么所谓的多维数组,只有一位数组,数组名及其后面的中括号说明了数组的元素情况,剩下的是数组元素的类型。这里所谓“剩下的”那这里的a来说就是指的 int [5][5]。这样你明白了吗?
其实,数组与指针的内容也就这么点而已,好好揣摩,很多问题就自然而解了。当然,如果有朋友认为我的理解有问题,非常欢迎大家批评指正哈!我写这篇blog就是给不熟悉数组和指针的朋友看的,对于高手,真的是班门弄斧了。看完博文还不懂得,建议大家看看《C专家编程》和《C与指针》,这两本书说的都很明白!也很经典!