c语言入门第4节,制作可以变形的积木,函数的形参和实参

上一节介绍了如何自己制作积木——定义自己的函数,并且给出了例子。应该能记得,上一节中自定义的函数既没有返回值,也没有参数,但是实际应用中,要解决复杂的问题,函数应该能够根据外界的输入做出相应的变化。例如,我们需要打印出 4+6 的值,函数可以如下定义:


image
void add()
{
    printf("4+6=%d\n", 4+6);
}

的确,add 函数能够打印出 4+6 的值,解决了问题。但是,可能还会有类似,但不相同的问题出现,比如需要打印出 3+4 的值,这时上面定义的 add 函数就没有办法解决问题了,只能重新定义一个函数。这非常麻烦。事实上,C 语言中的函数可以接收外界传入的数据,我们如下修改 add 函数:

void add(int a, int b)
{
    printf("%d+%d=%d\n", a, b, a+b);
}

这样,add 函数解决的就不是一个问题了,而是一类问题,打印 4+6 的值只需调用 add(4, 6),打印出 3+4 的值,只需调用 add(3, 4)。


image

形参和实参

在之前一节,我们介绍了全局变量和局部变量,知道了函数的参数也属于局部变量。在 C 语言中,函数的参数分为“形参”和“实参”,以上面定义的 add 函数为例,我们调用 add(4, 6) 时,函数中的参数 a 就代表 4,b 就代表 6。确切的说,当我们讨论函数中的 a 这个参数时,我们所说的“参数”是指“形参”,当我们讨论传一个参数 4 给函数时,我们所说的“参数”是指“实参”。

但是我习惯都叫参数而不习惯总把形参、实参这两个文绉绉的词挂在嘴边儿(事实上大多数人都不习惯),可根据上下文判断指的到底是形参还是实参。记住这条基本原理:形参相当于函数中定义的变量,调用函数传递参数的过程相当于定义形参变量并且用实参的值来初始化

int main()
{
    int p1 = 4, p2 = 6;
    add(p1, p2);
    return 0;
}

上面在 main 中调用了 add 函数,就相当于在 add 函数中执行了如下语句:

int a = p1;
int b = p2;
printf("%d+%d=%d\n", a, b, a+b);
image

main 函数的变量 p1 和 add 函数的参数 a 是两个不同的变量,只不过它们各自的存储空间中存了相同的值 4,因为变量 p1 的值赋给了参数 a。同理,变量 p2 的值赋给了参数 b。C语言中在调用函数时,每个参数都需要得到一个值,函数定义中有几个参数,在调用中就需要传几个参数,不能多也不能少,每个参数的类型也必须对应上。

事实上,C 语言中也定义了一些参数不定的函数,比如 printf,它可以接收 1 个或多个参数。以后遇到需要定义这样的函数时,再详细介绍。

易错点

请看如下代码:

void add(int a)
{
    a=a+1;
}
int main()
{
    int p = 2;
    add(p);
    printf("p=%d\n", p);
    return 0;
}

该程序员原计划让 add 函数实现参数 p 加一,但是却失败了,以上代码输出的是 p=2。这是因为 add 函数中的参数 a 和 main 函数中的 p 根本就是两个变量。add 函数在执行完毕后,它所在的内存就被收回了。关于这一点,《》一节说的非常清楚,可以再回顾一下。

image

上一节,我们把自定义函数比作自己做积木,那自定义带参数的函数,就相当于制作可以变形的积木,更加灵活,所以能够完成更多工作。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,176评论 5 469
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,190评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,232评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,953评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,879评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,177评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,626评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,295评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,436评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,365评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,414评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,096评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,685评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,771评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,987评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,438评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,032评论 2 341

推荐阅读更多精彩内容

  • 原文地址:C语言函数调用栈(一)C语言函数调用栈(二) 0 引言 程序的执行过程可看作连续的函数调用。当一个函数执...
    小猪啊呜阅读 4,582评论 1 19
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,705评论 0 38
  • 函数和对象 1、函数 1.1 函数概述 函数对于任何一门语言来说都是核心的概念。通过函数可以封装任意多条语句,而且...
    道无虚阅读 4,511评论 0 5
  • 第5章 函数和函数式编程 5.1 引言函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数...
    VIVAFT阅读 938评论 0 5
  • 1、c语言的函数有以下特点: (1)才源程序由函数组成,一个主函数main()+若干其他函数 C程序中的函数类似文...
    滕王阁序阅读 1,324评论 0 6