C语言8函数上(基础篇)

目录

函数的基本用法

练习

比较两数大小

什么叫形参

什么叫实参

函数原型声明 

函数的调用

 练习-求素数的个数

 参数传递

全局变量

值传递方式

指针传递方式


函数的基本用法

函数是一个完成特定功能的代码模块,其程序代码独立,通常要求有返回值,也可以是空值。

l一般形式如下:<数据类型><函数名称>(<形式参数说明>){语句序列;return[(<表达式>)];}

#include <stdio.h>
 
void print_hello();
 
int main() {
    print_hello();
    return 0;
}
 
void print_hello() {
    printf("hello world\n");
}

<数据类型>是整个函数的返回值类型。return[(<表达式>)]语句中表达式的值,要和函数的<数据类型>保持一致。如无返回值应该写为void型

练习

比较两数大小

int get_max(int x, int y);

int main() {
    int i, j;
    int ret;
    printf(">");
    scanf("%d%d", &i, &j);

    ret = get_max(i, j);
    printf("max:%d\n", ret);

    return 0;
}

int get_max(int a, int b) {
    if (a < b) {
        return b;
    }
    else {
        return a;
    }
}

什么叫形参

形参全称为“形式参数”

形参是在定义函数的时候使用的参数

目的是用来接收调用该函数时传递的参数

什么叫实参

实参,全称为"实际参数"。

实参是在调用时传递给函数的参数,即传递给被调用函数的值。

在主调函数中调用一个函数时,函数名后面括弧中的参数(可以是一个表达式)称为“实际参数”。

实参和形参是不同的地址参数,调用函数时实参值传递给形参,修改形参的值不会影响到实参。

函数原型声明 

函数的说明就是指函数原型l其中,<形式参数说明>可以缺省说明的变量名称,但类型不能缺省

例如

double power(double,int);

#include <stdio.h>
 
int fun_prime(int n);//如果不申明,系统会报错找不到该函数
 
int main() {
    int n = 26;
 
    if (fun_prime(n)) {
        printf("%d is prime\n", n);
    } else {
        printf("%d isnot prime\n", n);
    }
    return 0;
}
 
int fun_prime(int n) {
    int i;
    if (n == 1) {
        return 0;
    }
 
    for (i = 2; i < n; i++) {
        if (n % i == 0) {
            return 0;
        }
    }
    return 1;
}

函数的调用

 练习-求素数的个数

#include <stdio.h>
 
int fun_prime(int n);
int fun_prime_sta(int n);
 
int main() {
    int n;
    int count;
 
    printf("input n:");
    scanf("%d", &n);
 
    count = fun_prime_sta(n);
    printf("count=%d\n", count);
 
    return 0;
}
 
int fun_prime(int n) {
    int i;
    if (n == 1) {
        return 0;
    }
 
    for (i = 2; i < n; i++) {
        if (n % i == 0) {
            return 0;
        }
    }
    return 1;
}
 
int fun_prime_sta(int n) {
    int i;
    int sum = 0;
    for (i = 1; i < n; i++) {
        if (fun_prime(i)) {
            printf("%d\n", i);
            sum++;
        }
    }
    return sum;
}

 参数传递

全局变量

全局变量就是在函数体外说明的变量

全局变量一经定义后就会在程序的任何地方可见。

函数调用的位置不同,程序的执行结果可能会受到影响。

不建议使用

#include <stdio.h>
 
int global_a = 200;
double fun_pow(double x, int n);
 
int main() {
    double x = 2;
    int n = 10;
    printf("%lf\n", fun_pow(x, n));
    printf("global_a=%d\n", global_a);
    /*
    double ret;
    ret = fun_pow(x, n);
    printf("%lf\n", ret);
    */
 
    return 0;
}
 
double fun_pow(double x, int n) {
    int i;
    double ret = 1;
 
    global_a++;
 
    for (i = 0; i < n; i++) {
        ret *= x;
    }
    return ret;
}

值传递方式

值传递

形参是新开辟的存储空间,在函数中改变形参的值,不会影响到实参

比如交换两个数的函数,用值传递无法实现

#include <stdio.h>
 
void fun_swap(int a, int b);
 
int main() {
    int x = 200, y = 100;
     
    printf("before:x=%d y=%d %p %p\n", x, y, &x, &y);
    fun_swap(x, y);
    printf("after:x=%d y=%d\n", x, y);
 
    return 0;
}
 
void fun_swap(int a, int b) {//int a=x; int b=y;
    int t = a;
    a = b;
    b = t;
    printf("a=%d b=%d %p %p\n", a, b, &a, &b);
}

可以看到 实参x/y和形参a/b的地址不一致,修改ab的值不会影响到xy

指针传递方式

按地址传递,实参为变量的地址,而形参为同类型的指针

被调用函数中对形参的操作,将直接改变实参的值

被调用函数对指针的目标操作,相当于对实参本身的操作 

#include <stdio.h>
 
void fun_swap(int * p, int * q);
 
int main() {
    int m = 10, n = 20;
 
    fun_swap(&m, &n);
    printf("m=%d n=%d\n", m, n);
 
    return 0;
}
 
void fun_swap(int * p, int * q) {//int * p = &m; int * q = &n;
    int t = *p;
    *p = *q;
    *q = t;
}

 可以看到指针传递,pq的地址和mn的地址一致,修改*q、*p的值等于修改m、n的值

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值