算法精解九(C语言版)

作为函数参数的指针

        在C语言的函数调用由指针起着至关重要的作用。最重要的是,指针支持将参数作为引用传递给函数(即按引用调用)。按引用传递参数时。当函数改变此参数时。这个被改变参数的值会一直存在。甚至函数提出后都仍然存在。相对而言,当按值调用传递函数时,此时值的改变只能持续到函数返回时。无论是否是改变函数的输入输出参数,使用指针传递大量复杂也是十分高效的手段。这种方法高效的原因就在于,我们只是传递一个指针而不是一个数据的完整副本到函数中,这样可以大大地节省内存空间。本书中多处都用到了这种方法。

按引用到用传递参数

       在形式上,C语言只支持按值来传递参数。在按值调用传递参数过程中,函数参数的一份私有副本将会用到函数的执行体中。然而,我们可以模仿按引用调用传递参数将一个指向参数的指针(本不是参数本身)传递函数,这样函数调用者就可以得到一个指针的私有副本用于函数体的执行过程。

要了解按应用调用是如何实现的,我们来看看swapl.swapl是一个实例将两个整形变量相互交换的函数,函数参数是通过按值调用传递的。所以得到的结果是错误的。图2-4说明了为什么见韩函数不起作用。swap2同样一个交换函数,只是它的参数是按引用调用传递的。图2-5说明如何使用指针来修正swapl中的错误。

关于C语言中按引用调用传递参数,其好的一面是语言本身赋予了我们精确控制参数传递的能力。不好的方面是,这种控制有时候会显得很麻烦,因为我们常常需要在函数中多次解引用按引用调用的参数。

另一个在函数调用时会用到指针的地方,就是把数组传递给函数的时候。回顾之前我们所说的,C语言显然把数组名当做一个不可变的指针来使用,当向函数传递一个类型为T的数组对象时,其实就是等同于向函数传递一个指向类型为T的对象的指针。所以,我们可以交替使用这两种方法。例如 函数f1和函数f2是功能是一样的。

具体使用哪种方式来传递参数取决于约定俗成或函数处理参数的方法。当使用一个数组作为参数时,数组的边界信息并不重要,因为此时编译器并不要求数组有边界信息。但是,提供边界信息对于表达出函数内部处理该参数具有一定的局限性是一种很有用的方法,在使用多维数组作为参数的函数中,边界信息显得尤为重要。

当把一个多维数组传递给函数时,除了第一维以外,其他维的长度必须指定,这样函数才能通过指针算术运算访问呢具体元素,如一下代码如示:

为了更清楚的理解为什么必须指定第一个维度的大小,设定有一个3行2列的整型二维数组。在C语言中,此二维数组的元素在内存中按照地址的递增一行一行顺序排列。就是说,第1行的两个整数存储在前两个位置,接着是第2行的两个整数,在接着就是第3行的两个整数。所以,如果想访问到任意一行的元素(除了第1行)时,我们首先必须确切知道达到这一行我们需要跳过多少个连续的元素(见图2-6).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值