C语言-函数

众所周知,C程序是由函数组成的。虽然在C程序中大都有且只有一个主函数(main(int argc,char argv[])),但使用程序往往由多个函数组成的。函数是C程序的基本模块,通过对函数模块的调用实现特定的功能。C语言中的函数相当于其它高级语言中的子程序。C语言不仅提供了丰富的函数库(如Turbo C,MS C都提供了三百多个函数),还允许用户建立自己定义的函数。用户可以把自己的算法编成一个个相对独立的函数模块,然后用调用的方法来使用函数。可以说C程序的全部工作都是由各式各样的函数完成的,因此C语言又称之为函数式语言。
另外,main函数是主函数,它可以调用其它函数,而不允许被其它函数调用。因此,C程序的执行总是从main函数开始的,完成对其它函数的调用后再返回到main函数,最后由main函数结束整个程序。一个C程序必须有且只有一个主函数main。

1 函数的定义

定义:多个语句的集合,构成一个函数。

  1. 无参函数

函数的一般形式:
类型标识符 函数名()
{(函数声明部分)
语句
}
说明:类型标识符和函数名称为函数头。类型标识符指明了本函数的类型,函数的类型实际上就是函数返回值得类型。函数名是由用户定义的标识符,函数名后有一个空括号,其中可以无参数,但是括号必须有。
{}中的内容称为函数体。在函数体中声明部分,是对函数体内部所用到的变量类型说明。
在很多情况下,不要求无参函数有返回值,此时函数类型符可以写为void。

//案例1:
void hello()
{
    printf("hello world!\n");
}
//hello 为一个无参函数,因为它没有返回值,当被调用时,输出“hello world!”
  1. 有参函数
    类型标识符 函数名(形式参数表达式)
    {(函数声明部分)
    语句;
    }
    有参函数比无参函数多了一个(形式参数表达式)。在形参表中给出的参数称为形式参数(简称“形参”),多个形参之间用逗号隔开。在进行调用时,主函数将赋予这些形参实际值。既然,形参为变量,那么在形参表中给出形参的类型说明。
// 案例2:
int min (int a, int b)  //说明min函数为整型函数,且有整型返回值,a,b均为形参变量
{
    if (a>b)
      return b;
    else
      return a;
}

2 函数的调用

  1. C语言中函数调用的一般形式:
    函数名(实参表达式)
    对于无参函数调用时则无实际参数表。实际参数表中的参数可以是常量,变量或者其它构造类型数据及表达式。各实际参数之间用逗号分隔开。
  2. 函数调用的方法

1.函数表达式:函数作为表达式中的一类,以函数返回值参与表达式的运算。
2.函数语句:函数调用的一般形式加上分号,即构成函数语句。例如printf("%d\n",s);scanf("%d",a)。
3.函数实参:函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。
注意:在调用函数的时候,被调用的函数一定在调用前进行声明。

3 函数的声明

告诉被调用者,函数是存在的,是被定义过的。
一般形式:
类型说明符 被调用函数名(类型 形参,类型 形参…)
或:
类型说明符 被调用函数名(类型 类型…)
注意:括号内只给出形参和类型,或只给出类型,从而方便编译系统进行检错,以防止可能出现的错误。

int max (int a,int b)
// 也可以写为:
int max (int ,int)

定义函数注意事项:
1.函数内部不允许定义函数;
2.如果函数的数据类型是void的,那么可以有return,也可以没有return。如果有return,后面不能有值。
3.如果函数的数据类型是非void类型,那么必须要有一个return,而且return后面必须要有值(可以是常量,也可以是变量),且值得数据类型必须和函数的数据类型保持一致。

4 return的作用

1.当函数碰到return,return后面的代码将不会被执行,标志着函数的结束。
2.将信息返回给函数的调用者

#include <stdio.h>
int sum(inta,int b)
{
 c=a+b;
 return c;
}
int main()
{
 int a=1,b=2;
 int c=sum(a,b);
 printf ("c=%d\n",c);
 return 0;
}

5 函数和数组的关系

数组可以作为函数的参数使用,进行数据传送。有两种形式:
1 数组元素作为函数实参
数组元素作为函数实参使用与普通变量是相同的,在函数调用时,把作为实参的数组元素的值传送给形参,实现单向的值传送。
练习:判断一个整数数组中的元素,若大于零输出,若小于零输出零。

#include<stdio.h>
void nzp(int b)
{
    if(b>0)
      {
        printf("%d",b);
      }
      else
      {
        printf("%d",0);
      }
}
int main()
{
    int a[5],i;
    for (i=0;i<5;i++)
    {
      printf("input a number:");
      scanf("%d",&a[i]);
      nzp(a[i]);
    }
}

2.数组名作为函数参数
练习:求一个整型数组元素的平均值

#include<stdio.h>

int aver(int a[5])
{
    int ave=0,i;
    for(i=0;i<5;i++)
    {
      ave+=a[i];
    }
    ave/=5;
    return ave;
}
int main()
{
    int a[5],i;
    for(i=0;i<5;i++)
    {
      printf("input a number:");
      scanf("%d",&a[i]);
     }
    int ave=aver(a);
    printf("%d\n",ave);
    return 0;
}

用数组名作为函数参数时,应注意:
1.形参数组和实参数组的必须一致;
2.形参数组和实参数组的长度可以不同,因此在调用时,只传首地址而不检查形参数组的长度。当形参数组的长度和实参数组的长度不一致时,虽然不会出现语法错误,但执行程序结果将与实际不符时,需要注意。

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

推荐阅读更多精彩内容

  • 原文地址:C语言函数调用栈(一)C语言函数调用栈(二) 0 引言 程序的执行过程可看作连续的函数调用。当一个函数执...
    小猪啊呜阅读 4,607评论 1 19
  • C语言函数(一) 谨记 短暂的人生中,注定有很多人陪伴着你度过,陪你一起欢呼,陪你一起伤心流泪,陪你一起走过一条又...
    长风留言阅读 2,263评论 1 7
  • 1、c语言的函数有以下特点: (1)才源程序由函数组成,一个主函数main()+若干其他函数 C程序中的函数类似文...
    滕王阁序阅读 1,340评论 0 6
  • 本文是小结了一下C语言的函数语法,详细介绍了C语言函数语法的概述、函数的定义、函数的返回值、函数调用等7个方面的内...
    踩在浪花上00阅读 1,585评论 0 3
  • 发现gogo的英语爱好,是在她三岁的时候。没上幼儿园的她在家瞎蹦哒。偷懒的我下载了迪斯尼英语的动画片。里面全英文的...
    如月君阅读 287评论 1 4