【C语言基础系列】C语言函数基本使用

写在前面:学习的第一门语言是Java,之前对C也了解一点,也只是了解一点,在加上长时间没有接触了,基本就只会一个Hello World了。现在由于准备升本考试,不得不从头开始学C。这里从零开始,记录C语言学习点滴。欢迎正在学习C语言的小伙伴一起学习,未来可期,一起加油!

函数定义

函数是一个完成特定工作的独立程序模块,包括库函数和自定义函数两种。例如:scanf(),printf()等为库函数,由于C语言系统提供定义,使用时直接调用即可。自定义函数就需要自己定义后才可以使用。函数定义的一般形式为:

函数类型 函数名(形式参数表){     /* 函数首部 /
    函数实现过程     /
函数体 */
}

函数首部
函数首部由函数类型、函数名和形式参数表组成,位于函数定义的第一行。函数首部中,函数名是函数整体的称谓,需要用一个合法的标识符表示。函数类型指函数结果返回的类型,一般与return语句中表达式的类型一致。形式参数表中给出函数计算所要用到的相关已知条件,以类似变量定义的形式输出,其格式为:
类型1   形参1, 类型2   形参2,…,类型n   形参n

各个形参之间用逗号分隔,每个形参前面的类型必须分别写明。函数的形参的数量可以是一个,也可以是多个,或者没有形参。
【注】函数首部后面不能加分号,它和函数体一起构成完整的函数定义。

函数体
函数体体现函数的实现过程,有一对大括号内的若干条语句组成,用以计算,或完成特定的工作,并用return语句返回运算的结果(返回的结果类型必须和函数首部定义的类型一致)。

函数的定义案例如下:

/* 定义函数首部 */
int sum(int a, int b){
    /* 函数体部分 */
    
    return 10; /* 返回结果 */
}

函数的调用
定义个函数后,就可以在程序中调用这个函数。在C语言中,调用标准库函数时,只需要在程序的最前面用#include命令包含相应的头文件;调用自定义函数时,程序中必须有与调用函数相对应的函数定义。

函数调用的形式
函数调用的一般形式为:
函数名(实际参数)
实际参数(简称实参)可以是常量、变量和表达式。对一函数调用通常出现两种情况:
① 赋值语句
volume = sum(10, b);
② 输出函数的实参
printf("%d", sum(10, b));

参数传递
函数定义时,位于其首部的参数被称为形参,如a和b。调用函数的参数被称为实参,如10和b。形参除了能接受实参的值外,使用方法与普通变量类似。形参和实参必须一一对应,两者数量相同,类型一致。程序运行遇到函数调用时,实参的值依次传递给形参。

函数的形参必须是变量,用于接受实参传递过来的值;而实参可以是常量、变量或表达式,其作用是把常量、变量或表达式的值传递给形参。如果实参是变量,它与所对应的形参是两个不同的变量。实参是主调函数的,形参是自定义函数,这两者可以同名,也可以不同名。

【注】在参数参数传递过程中,将实参的值复制给形参。这种参数传递是单向的,只允许实参把值复制给形参,形参的值即使在函数中改变了,也不会反过来影响实参。

函数结果返回
函数结果返回一般为:return 表达式;
先需要求解表达式的值,在返回其值。一般情况下表达式的类型与函数类型应一致,如果两者不一致,一函数类型为准。return语句的作用有两个:一是结束函数的运行;二是带着运行结果(表达式的值)返回主调函数。

函数原型声明
C语言要求函数先定义后调用,就像变量先定义后使用一样。如果自定义函数被放在主调函数的后面,就需要在函数调用前,**加上函数原型声明(或成为函数声明)。**函数声明的一般格式为:
函数类型     函数名(参数表);
即与函数定义中的第一行(函数首部)相同,并以分号结束。

函数的使用

上述了解了函数的定义,下面通过一个小案例来进一步了解函数的使用。
例:使用函数输出1~100以内的全部素数。代码如下:

#include<stdio.h>
#include<math.h>

/* 声明函数 */
int prime(int m);

int main(){
    int i, count = 0;
    printf("1~100以内的素数有:\n");
    /* 循环1~100 */
    for(i = 1; i <= 100; i++){
        /* 调用prime判断i是否为素数 */
        if(prime(i) != 0){
            printf("%d\t", i);  /* 输出素数 */

            count++;
            /* 每行显示10个数 */
            if(count % 10 == 0){
                printf("\n");
            }
        }
    }
    return 0;
}

/* 判断是否为素数的函数 */
int prime(int m){
    if(m == 1){      /* 1不是素数,返回0 */
        return 0;
    }
    int i, n = sqrt(m);
    for(i = 2; i < n; i++){
        if(m % i == 0){
            return 0;   /* 如果m不是素数,返回0 */
        }
    }
    return 1;       /* 是素数返回1 */
}

输出结果为:
在这里插入图片描述
不返回结果的函数
上述中说到了函数返回的问题,其实有时候程序设计时也不可以不需要返回运算结果。不返回结果的函数定义:
void 函数名(形参表){      /* 函数首部 /
    函数实现过程     /
函数体 */
}
函数类型为void,表示不返回结果,函数体内不需要写return语句。void不能省略;否则函数类型被默认定义为int类型。
例:输出一个数字金字塔,代码如下:、

#include<stdio.h>

/* 声明函数 */
void pyramid(int n);

int main(){
    pyramid(5); /* 调用函数 */

    return 0;
}

/* 定义函数,输出n行数字金字塔 */
void pyramid(int n){
    int i, j;
    for(i = 1; i <= n; i++){    /*循环需要输出的行数*/
        for(j = 1; j <= n-i; j++){      /* 输出每行左边的空格 */
            printf(" ");
        }
        for(j = 1; j <= i; j++){
            printf("%d ", i);
        }
        printf("\n");
    }
}

运行效果如下:
在这里插入图片描述
局部变量和全局变量
上述中定义变量都是在函数的内部定义的,它们只限于所在的函数内使用。因此主调函数只有通过参数传递,才能把实参数据传递给函数使用;同样形参的改变也不会影响到实参变量。这种称为局部变量。下面来看看全局变量的定义,与使用。

定义在函数外面而不属于任何函数的变量称为全局变量。全局变量的作用范围是从定义开始到程序所在文件的结束,它作用范围内所用的函数都起作用。

【注】一般情况下会把全局变量定义在程序的最前面,即第一个函数的前。由于全局变量和局部变量的作用范围不同,允许它们同名。但某函数的局部变量与全局变量同名时,在该函数调用变量,调用的为局部变量。

全局变量的定义:

#include<stdio.h>

/* 定义全局变量x */
int x;
/* 声明函数 */
int f();

int main(){
    int a = 1;

    x = a;  /* 对全局变量x赋值为1 */
    a = f();

    printf("x = %d, a = %d", x, a);

    return 0;
}

int f(){
    int x = 4;  /* 定义一个与全局变量名相同的局部变量 */
    return x;   /* 返回的为局部变量x为4 */
}

运行结果如下:
在这里插入图片描述
可以看出输出的x为全局变量的值,a为返回的局部变量值。


由于初学C语言,上述内容如有错误地方,恳请各位大佬指出!

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值