C语言入门第14课:C的灵魂

  在上节课程当中,我们学习了C语言中又一种数据类型:数组,这是相当常用的一种数据存储形式了,但是实际上,提到C语言,最具代表性的数据类型,一定是“指针”,这种数据类型甚至成为了衡量一种语言是否能够给程序员足够的控制空间的标准。对于“指针”的理解深度和使用熟练度,确实能够在相当的程度上反映一个程序员对C语言编程的掌控力和熟练程度。所以,今天我们就先了解一下什么是“指针”。

  指针,通常我们理解它一定是有“指向”功能的,常识里,通常指针会指向一个位置,以便于我们认识那个位置,以后也可以找到那个位置。在C语言编程中,实际上指针的意义与常识中有所联系(可能这也是它名字的来源),它在C语言中代表的是一个“地址”,我们可以理解为“指向”某个变量的“位置”(在内存中),但其物理上的意义,就是一个内存的地址,请记住这一点,无论指针的形式如何变化,你以后可能还会接触到多维指针,但请记住这一点,无论是什么指针,它的物理意义,就是一个内存地址!

  介绍了指针的意义,我们来看一下如何声明一个指针,以及一个指针该如何使用。我们先来看一段示例代码:

  

  我们可以看到,指针的声明需要用到运算符“*”,一个一般数据类型后面紧跟着一个*运算符(也可以*运算符紧跟着后面的变量名称),再加上一个合法的变量名称,一个指针的声明就完成了。从上例中,我们也可以看到如何给指针赋值,理解起来很容易,因为指针是存储的内存地址,所以给一个指针赋值自然就会用到取址运算符&,需要注意的是,一般情况下,一个什么类型的指针就需要取值运算符&去获取一个什么类型的变量的地址。给指针单独赋值的时候,注意不要在指针变量的前面带上*(声明的时候直接初始化则不需要也不能去掉*)。不知道你是否注意到了,在上面的例子中,我们在调用printf函数的时候,使用指针变量的时候用到了形如“*p”、“*p_str”这样的形式,这是取指针指向的变量的值的含义。

  那么一个指针有什么用呢,上例中实际上给出了一个指针的一般用法,前后两次的打印会输出什么样的结果呢?我们来看:

  

  你得到了什么样的结论?仔细观察我们例子中的源码,实际上每个指针我们只进行了一次赋值,但是前后两次的打印中,它们的值居然发生了变化!为什么会这样呢?我们注意到在两次打印的中间,源码中给两个一般的变量进行了重新赋值的操作,而两个指针所指向的数值也跟随发生了变化!没错,这就是指针的意义所在了!正如我们在最开始的指出的那样,指针指向的是一个内存地址,而一个一般的变量,从其声明的时候开始,就有了一个内存地址,它的值就保存在这个地址当中,无论它的值如何改变,存储这个值的位置都不会变。我们可以用一个一般的事物做一个比喻,一个变量的声明,就好像一座房子有了主人,房子的门牌号就好像是这个变量的地址,变量的重新赋值,就好像房子里可以重新放入新的东西。很显然,房子的东西发生了变化(变量的值的变化),门牌号(变量地址)是不会变的,所以,我们知道门牌号,就能通过这个相同的门牌号看到变化前后的房间里的东西。同样的,通过保存变量地址的同一个指针,我们自然就能够得到变化前后的变量的不同的值了。

  指针的使用方式变化无穷,而且它的灵活性正是C语言所独有的,但我们今天先不去考虑那么复杂。我们介绍一种指针更加常用的指针的用法:传出参数。

  前面我们已经学习了函数,并且知道函数可以有一个返回值,但你是否有想过一个问题,函数只有一个返回值,如果我们需要一个函数给我们多于一个数值返回的时候,我们要怎么做呢?经过以后的学习,你会想到更多的方法,但今天我们学习了指针,就已经有一种方法了,我们来看下面的例子:

  

  聪明的你一定已经发现了指针的这个用法了,我们可以通过函数的返回值来判断函数的执行是否是成功的,而函数执行的结果,则可以通过指针参数来传递。没错,正是因为指针指向的一个地址,这里的指针就好像是一个邮筒,不同函数之间传递这个参数时,就好像把邮筒的位置进行了共享,而两个函数内都可以根据邮筒的位置拿到邮筒中的“信件”!很显然,我们还可以通过更多的函数指针参数传递其他的信息。

  好了,关于指针,我们就先学习这么多吧,更多的指针用法需要我们在未来逐步的去掌握。如果你有什么问题,请在评论区进一步讨论吧!

  更多的课程请点击这里:

  举报/反馈