文档章节

C Primer Plus 第9章 函数 9.6 改变函数中的变量

idreamo
 idreamo
发布于 2016/07/15 05:41
字数 701
阅读 20
收藏 0

有时我们需要用一个函数改变另一个函数中的变量。例如,排序问题的一个常见任务是交换两个变量的数值。假设要交换两个变量x和y的数值:
    x=y;
    y=x;
    上面这段简单的代码并不能实现这个功能,因为当执行第二行时,x的原数值已经被y的原数值所代替。这就需要另外一行语句对x的原数值进行存储。
    temp=x;
    x=y;
    y=temp;
    现在这段代码就可以实现数值交换的功能,可以将其编写成一个函数并构造一个驱动程序进行测试。在程序清单9.13中,为了清楚的表明某变量属于函数main()还是属于函数interchange(),前者使用了变量x和y,后者使用的是u和v。
    程序清单 9.13 swap1.c程序
    /*swap1.c  交换函数的第一个版本*/
  

  #include <stdio.h>
    void interchange(int u,int v); /*声明函数*/
    int main(void)
    {
        int x=5,y=10;
        printf("Originally x = %d and y = %d.\n",x,y);
        interchange(x,y);
        printf("Now x = %d and y = %d.\n",x,y);
        return 0;
    }
    
    void interchange(int u,int v)
    {
        int temp;
        temp = u;
        u = v;
        v = temp;
    }

 程序的运行结果如下:
    Originally x = 5 and y = 10.
    Now x = 5 and y = 10 .
令人吃惊的是数值并没有发生交换。下面我们在interchange()中加入一些打印语句来检查错误。
    程序清单 9.14 swap2.c程序
    /*swap2.c  --分析swap1.c程序*/
   

#include <stdio.h>
    void interchange(int u,int v);
    int main(void)
    {
        int x = 5,y = 10;

        printf("Originally x = %d and y = %d.\n",x,y);
        interchange(x,y);
        printf("Now x = %d and y = %d.\n",x,y);
        return 0;
    }
    void interchange(int u,int v)
    {
        int temp;
    
        printf("Originally u = %d and v = %d.\n",u,v);
        temp = u;
        u = v;
        v = temp;
        printf("Now u = %d and v = %d.\n",u,v);
    }


新的输入结果是:
    Originally x = 5 and y = 10.
    Originally u = 5 and v = 10.
    Now u = 10 and v = 5.
    Now x = 5 and y = 10.
函数interchange()并没有出错,u和v的数值确实发生了交换。问题在于把执行结果传递给main()的时候。正如已经指出的那样,interchange()使用的变量独立于函数main(),因此交换u和v的数值对x 和y 的数值没有任何影响!使用return()语句可以吗?可以在interchange()的结尾处加入下面的一行语句:
    return (u);
然后改变main()中对该函数的调用方式:
    x = interchange(x,y);
做了上述更改以后,x被赋予了新值,而y的数值并没有改变。因为return语句只能把一个数值传递给调用函数,但现在我们需要传递两个数值,这并非不能实现!只需要使用指针就可以了。

© 著作权归作者所有

idreamo
粉丝 18
博文 139
码字总数 224743
作品 0
青岛
产品经理
私信 提问
C Primer Plus 第9章 函数 9.3 递归

9.3.1 递归的使用 为了具体说明,请看下面的例子。程序清单9.6中函数main()调用了函数upanddown()。我们把这次调用称为“第一级递归”。然后upanddown()调用其本身,这次调用叫做“第二级递...

idreamo
2016/07/12
82
0
C Primer Plus 第9章 函数 9.5 地址运算符:&

在上文中函数scanf()就是使用地址作为参数。更一般地,当需要改变调用函数中的某个数值时,任何被调用的无返回值的C函数都需要使用地址参数来完成该任务。 一元运算符&可以取得变量的存储地址...

idreamo
2016/07/15
22
0
C Primer Plus 第9章 函数 9.7 指针简介

一般来讲,指针是一个其数值为地址的变量(或更一般地说是一个数据对象)。 正如char类型的变量用字符作为其数值,而int类型变量的数值是整数,指针变量的数值表示的是地址。 如果您将某个指...

idreamo
2016/07/15
40
0
C Primer Plus 第9章 函数 9.1 函数概述

9.1 函数概述 首先,什么是函数?函数(funcation)是用于完成特定任务的程序代码的自包含单元。 为什么使用函数?第一,函数的使用可以省去重复代码的编写。第二,即使某种功能在程序中只使用...

idreamo
2016/07/08
63
0
C Primer Plus(5版)第8章编程题1_重定向实现

小伙伴们,对C语言编程有疑问的,可以加微信交流:poo_poo或者扫描我的头像,验证时请注明是“知友” 一、题目描述 本题是第8章编程题的第一道题,题目如下: 二、题目及思路分析 从题述来看...

石家的鱼
2017/07/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

DevOps是如何实现效率的提升?

随着企业业务对软件系统日益依赖,IT管理与研发模式也随之对“敏态”模式产生了需求,也就是今天时常提起的DevOps。提升效率,是DevOps实践的核心内容之一。就让我们来一起从软件生命周期的业...

嘉为科技
20分钟前
2
0
总结:linux目录之proc

我们系统大部分的基础数据采集,其实就是读取proc目录下的文件,并解析获取数据的过程。 1、如cpu利用率:直接cat /proc/cpuinfo命令,然后获取输出内容,并解析里面的数据,如cpu核数等; ...

浮躁的码农
22分钟前
2
0
比原Bapp红包应用

喜迎国庆期间,比原链在自己的移动端钱包Bycoin(下载地址)和google插件钱byone中推出了红包应用,在国庆期间深受大家好评。 那我们今天就来大概介绍一下比原红包,以及基于比原链开发dapp应用...

比原链Bytom
23分钟前
2
0
Linux中没有rc.local文件的解决方法

Linux中没有rc.local文件的解决方法是什么呢?这应该是很多工程师比较头疼的问题,下面就给大家例举几个解决办法。 比较新的Linux发行版已经没有rc.local文件了。因为已经将其服务化了。 解决...

xiangyunyan
23分钟前
2
0
数据中台在阿里巴巴集团内部的实践情况

作者:品鉴 数据中台门在阿里巴巴集团干什么的,由哪个部门掌管?数据中台在阿里巴巴的主要作用是什么呢?外面吹嘘这么神秘的数据中台在阿里实践的如何呢?今天小编正好要采访数据技术及产品...

阿里云官方博客
23分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部