正如前一篇博客所说的,但凡人都是急功近利和有惰性的,都不喜欢花时间去阅读那些我们认为枯燥的文字描述,喜欢直接进入主题。但是有时候恰恰就是因为我们的这种急功近利和惰性,使得我们绕了很大一个弯,到最后还是回到了文字描述上来,所以我觉得适当的文字描述下,让读者对于文章的整体有个大概的认识之后,再去学习能收获更好的效果。我的前两篇关于C指针的博客用的摘要都是copy我第一篇C指针博客的摘要,当然这篇也不例外,还是会引用我第一篇博客的摘要,只是在引用摘要之前我要先交代件事儿,就是关于函数指针和指针函数、以及指针常量和常量指针我就不在此讲解了,有兴趣的朋友可以参考我之前写的两篇博客---C语言的那些小秘密之函数指针和C语言的那些小秘密之const修饰符。
懂得C语言的人都知道,C语言之所以强大,以及其自由性,绝大部分体现在其灵活的指针运用上。因此,说指针是c语言的灵魂,一点都不为过。所以从我的标题加了个(一)也可以看出指针的重要性,我尽可能的向大家交代清楚我对于指针的理解。所以在讲解的过程中我尽可能的用代码加文字的描述方式,通过代码的分析来加深我们对于指针的理解,我给出的都是完整的代码,所以读者可以在看的过程中直接copy下去即可运行,希望下面的讲解能够对你有所帮助。
先让我们来看看一段非常熟悉的代码:
#include <stdio.h> void main(int argc,char *argv[]) |
运行结果如下:
可能还是有人不是很了解main函数里的参数argc和argv是什么意思,在此做一简单的讲解,argc为命令行输入的参数个数,在此argc=3,有三个参数,分别是:fdsa.exe fdsa asdf,argv是一个指针数组,在此相当于char *argv[0]="fdsa.exe"、char *argv[1]="fdsa"、char *argv[0]="asdf"。有了上面的解释相信能够很好的理解main函数的参数了。
现在来分析下上面的代码,程序中有一句argv++;但是我们上面的分析是argv是一个数组名,而数组名是不能进行这样的++运算的,难道出错了嘛?!但是明明运行结果已经就在眼前了,在解释之前我们再来看如下一段代码:
#include <stdio.h> void main() |
编译发现出错了。
好了现在我们可以来解释为什么会出现如上两种情况了,有种特殊情况就是数组名作为函数参数,传递的是数组的首地址,系统会把形参当作变量来处理,所以如果我们吧main函数改写为main(int argc,char **argv);就好理解多了。
看了上面的代码,接下来我们看看指针数组和数组指针的区别所在。
一、指针数组指的是一个数组,数组中的每个元素都是指针类型,所有的指针都指向不同的地址,所指的地址的数据也不一定一样,但是所指的数据类型必须一样。
二、数组指针指的是定义的是一个指针,而指针指向的是数组,指针指向数组首单元的地址,对于数组内部元素的属性不了解,仅仅是规定了数组首单元的地址,通过它可以找到整个数组。
接下来看看一段代码:
#include <stdio.h> void main() |
运行结果如下: