C语言基础之函数

本文详细介绍了C语言中的函数概念,包括递归、内联、库函数和自定义函数的分类,以及函数的定义、声明和调用规则。重点讲解了函数参数传递,包括普通变量、数组(一维和二维)作为参数的使用和注意事项。
摘要由CSDN通过智能技术生成

一、概述及分类

1、概述

函数是c语言的功能单位,实现一个功能可以封装一个函数来实现,定义的时候一切以功能为目的,根据功能去实现函数的参数和返回值。

2、函数分类(定义角度)

递归函数:

​ 递归函数是指函数在其定义中直接或间接地调用自身的函数。

​ 递归函数需要有一个终止条件,否则会导致无限递归。

内联函数:

​ 内联函数是一种优化技术,通过将函数的代码直接插入到调用点来避免函数调用的开销。

​ 内联函数的定义通常使用inline关键字。

库函数:

​ C语言标准库提供了许多常用的函数,如输入输出函数、数学函数、字符串处理函数等。

​ 使用库函数可以简化代码,提高开发效率。

自定义函数:

​ 除了标准库提供的函数外,开发者还可以根据需要自定义函数。

​ 自定义函数的定义和调用方式与标准库函数类似,但可以根据具体需求进行定制。

3、函数分类(有无参数)

无参数的函数:不能将外部数据传递给函数内部

有参数的函数:通过参数将函数外部的数据传递到函数内部

(参数:函数外数据 到 函数内部的桥梁)

二、函数定义、声明、调用

函数的定义、函数的声明、函数的调用。

1、函数的定义:

实现函数体,确定函数名、函数的参数、函数返回的值类型

​ int add(int x, int y)

​ 返回什么类型的值函数定义为什么类型,x y为形参

​ 只有调用函数时才会给形参开辟空间

​ 无返回值定义为void 有返回值根据返回值类型定义

  • 函数定义由函数头和函数体两部分组成。

  • 函数头包括函数名、参数列表(参数类型、参数名称)和返回类型。

  • 函数体是花括号 {} 内的代码块,用于实现函数的功能。

    在这里插入图片描述

2、函数的声明

(函数,在调用之后要声明)

​ 将函数名放置调用之前后’;’

​ 如:int add(int x, int y);

#include <stdio.h>

//函数实体在调用之后,所以要事先声明
int Add(int x, int y);


int main(int argc, char const *argv[])
{
    int num = Add(1,2);
    printf("%d\n",num);
    return 0;
}

int Add(int x, int y)
{
    return x+y;
}

3、函数的调用

  • 在程序中,可以通过函数调用执行特定的功能。

  • 调用函数时,需要提供函数名和参数列表(如果有的话)。

  • 调用函数后,程序将跳转到函数体执行,执行完毕后返回到调用点继续执行后续代码。

    函数调用:实体名+实参

    int num = Add(1,2);
    

三、函数传参

1、普通变量作为函数的参数

​ 函数内部需要使用外部变量的值 需要将外部变量的值传递给函数内部。这时普通变量就作为函数的形参(单向传递之值传递)

​ 函数内部无法修改外部实参值

#include <stdio.h>
//函数实体在调用之后,所以要事先声明
int array(int x);

int main(int argc, char const *argv[])
{
    
    int x = 20;
    printf("x=%d  array=%d\n",x,array(x));
    return 0;
}
int array(int x)
{
    x = 10;
    return x;
}

X的值并未改变

2、一维数值数组作为函数的形参

函数内部可以通过形参对外部数组的元素进行读写

数组作为函数的参数

#include <stdio.h>

//函数实体在调用之后,所以要事先声明
void Input(int y[5]);
void Output(int y[5]);

int main(int argc, char const *argv[])
{
    int x[5];
    Input(x);
    Output(x);
    return 0;
}

void Input(int y[5])//写
{
    int i = 0;
    for(i=0; i<5; i++)
    {
        y[i] = i+10;
    }
    return;
}
void Output(int y[5])//读
{
    int i = 5;
    for(i = 0; i<5; i++)
    {
        printf("%d\n",y[i]);
    }
}

字符数组作为函数的参数

#include <stdio.h>
//函数实体在调用之后,所以要事先声明
void Input_str(char str[]);

int main(int argc, char const *argv[])
{
    char str[] = "l2312";
    Input_str(str);
    return 0;
}
void Input_str(char str[])
{
    printf("%c\n",str[2]);
}

3、一维数组作为案例

键盘输入10个数,输出数组中的最大值

#include <stdio.h>

//函数实体在调用之后,所以要事先声明
int Output_max(int y[],int n);

int main(int argc, char const *argv[])
{
    int y[128];
    int n=10;
    printf("请输入%d 个 int 数值:", n);
    int i=0;
    for(i=0;i<n;i++)
    {
        scanf("%d", &y[i]);
    }
    
    printf("%d",Output_max(y,n));
    return 0;
}
int Output_max(int y[],int n)
{
    int num = y[0],i;
    for(i=0; i<n; i++)
    {
        if(num < y[i])
            num = y[i];
    }
    return num;
}

4、二维数值数组作为函数的形参

二维数值数组作为函数的形参,函数内部 可以通过形参操作(读写)外部二维数值数组的元素。

#include <stdio.h>

//函数实体在调用之后,所以要事先声明
void Input_two(int y[3][4], int row, int col);
void Output_two(int y[3][4], int row, int col);

int main(int argc, char const *argv[])
{
    int y[3][4];
    Input_two(y,3,4);
    Output_two(y,3,4);
}
//二维数组的读写
void Input_two(int y[3][4], int row, int col)
{
    printf("请输入%d 个 int 数值:",row*col);
    int i=0;
    for(i=0;i<row;i++)
    {
        int j = 0;
        for(j=0;j<col;j++)
        {
            scanf("%d", &y[i][j]);
        }
    }
    return;
}
//数组遍历
void Output_two(int y[3][4], int row, int col)
{
    int i=0;
    for(i=0;i<row;i++)
    {
        int j = 0;
        for(j=0;j<col;j++)
        {
            printf("%d ", y[i][j]);
        }
        printf("\n");
    }
}

二维字符数组作为函数的形参函数内部可以 通过形参操作外部二维字符数组的元素

#include <stdio.h>

//函数实体在调用之后,所以要事先声明
void Input_char_two(char buf[5][128], int row, int col);
void Output_char_two(char buf[5][128],int row);

int main(int argc, char const *argv[])
{
    char buf[5][128] = {""};
    Input_char_two(buf,5,6);
    Output_char_two(buf,5);

}
//二维字符串数组
void Output_char_two(char buf[5][128],int row)
{
    int i=0;
    for(i=0; i<row; i++)
    {
        printf("%s\n",buf[i]);
    }
}
void Input_char_two(char buf[5][128], int row, int col)
{
    printf("请输入%d 个字符数串\n", row);
    int i=0;
    for(i=0;i<row;i++)
    {
        scanf("%s", buf[i]);//每个空格划分一个字符串
        //fgets(buf[i], col, stdin);//指定每个字符串长度为6
    }
}

5、二维数组作为参数的案例

键盘输入10个字符串,输出数组中的指定的字符串

#include <stdio.h>
//函数实体在调用之后,所以要事先声明
void Input_char_two(char buf[5][128], int row, int col);
void char_compare(char buf[5][128],int row,char str[]);
int main(int argc, char const *argv[])
{
	char buf[5][128] = {""};
    Input_char_two(buf,5,6);
        
    char buf[5][128] = {""};
    Input_char_two(buf,5,6);
    //字符串比较
    char_compare(buf,5,"asd");     
}

void Input_char_two(char buf[5][128], int row, int col)
{
    printf("请输入%d 个字符数串\n", row);
    int i=0;
    for(i=0;i<row;i++)
    {
        //scanf("%s", buf[i]);
        fgets(buf[i], col, stdin);
    }
}
//字符串比较
void char_compare(char buf[5][128],int row,char str[])
{
    int i = 0;
    for(i=0; i<row; i++)
    {
        if(strcmp(buf[i], str) == 0)
        {
            printf("%s\n",buf[i]);
            return;
        }
    }
    printf("dont have\n");
}

四、如有错误欢迎指正

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值