Skip to content

1.函数概述

1.函数是C语言的基本单元,包含可执行代码
2.主函数可以调用其他函数,其他函数可以相互调用
3.函数可以有参数和返回值

2.函数定义

函数定义:让编译器知道函数功能,包括定义函数头和函数体
函数头分为返回值类型、函数名、参数表
函数体包括局部变量的声明和函数的可执行代码
无参函数:没有参数的函数
空函数:没有任何内容的函数(占位)

plain
int AddTwoNumber(int Num1,int Num2)
{
    int result;
    result = num1+num2;
    return result;
}

函数要先声明,再定义
如果函数定义放在调用之前,就不需要声明

3.返回语句

返回语句:从所在函数中退出,回到调用程序中去,或者将函数值赋给调用的表达式

plain
//从函数返回
#include<stdio.h>
int Function();
int main()
{
    printf("这是输出前\n");
    Function();
    printf("这是输出后\n");
    return 0;
 } 
int Function()
{
    printf("这是输出中\n");
}

plain
//返回函数值 
#include<stdio.h>
int Minus(int Number1,int Number2)
{
    int result;
    result = Number1-Number2;
    return result;
}
int main()
{
    int result;
    result=Minus(9,5);
    printf("%d",result); 
    return 0;
}

plain
#include<stdio.h>
char ShowChar();
int main()
{
    char Result;
    Result = ShowChar();
    printf("%c\n",Result);
    return 0;
}
char ShowChar()
{
    int Number;
    printf("请输入一个数:\n");
    scanf("%d",&Number);
    return Number;
}

4.函数参数

4.1 形参与实参

形式参数:形式上存在的参数,放在括号里面,在拿书调用之前,传递给函数的值将被复制到形式参数中
实际参数:实际存在的参数,函数调用者提供给函数的参数

plain
#include<stdio.h>
void DrinkMilk(char *Bottle);
int main()
{
    char Poke[]="";
    printf("给宝宝喝:");
    scanf("%s",&Poke);
    DrinkMilk(Poke);
    return 0;
}
void DrinkMilk(char *Bottle)
{
    printf("宝宝喝%s\n",Bottle);
}

4.2 数组参数

数组作为实参时,只传递数组的地址,而不是传递整个数组
数组名作实参时,传递数组第一个元素的指针

plain
#include<stdio.h>
void ShowMember(int Member);
int main()
{
    int Count[10];
    int i;
    printf("请输入一个数组:\n");
    for(i=0;i<10;i++)
    {
        scanf("%d",&Count[i]);
    }
    for(i=0;i<10;i++)
    {
        ShowMember(Count[i]);
    }
    return 0;
 } 
void ShowMember(int Member)
{
    printf("数组元素为:%d\n",Member);
}

plain
#include<stdio.h>
void Evalute(int b[10]);
void Display(int b[10]);
int main()
{
    int a[10];
    Evalute(a);
    Display(a);
    return 0;
}
void Display(int b[10])
{
    int i;
    for(i=0;i<10;i++)
    {
        printf("数组元素是:%d\n",b[i]);
    }
}
void Evalute(int b[10])
{
    int i;	
    for(i=0;i<10;i++)
    {
        b[i]=i;
    }
}

4.3 指针作参数

plain
#include<stdio.h>
void Evalute(int *Point);
void Display(int *Point);
int main()
{
    int a[10];
    Evalute(a);
    Display(a);
    return 0;
}
void Display(int *Point)
{
    int i;
    for(i=0;i<10;i++)
    {
        printf("数组元素为:%d\n",Point[i]);
    }
}
void Evalute(int *Point)
{
    int i;
    for(i=0;i<10;i++)
    {
        Point[i]=i;
    }
}

4.4 main函数参数

argc:保存命令行的参数个数,整型
argv:指向字符指针数组的指针

plain
#include<stdio.h>
int main(int argc,char *argv[])
{
    printf("%s\n",argv[0]);
    return 0;
}

5.函数调用

调用方式分为函数语句调用,函数表达式调用,函数参数调用

5.1 函数语句调用

函数语句调用:把函数的调用作为一个语句

plain
#include<stdio.h>
void Display()
{
    printf("仅实现输出一条语句");
}
int main()
{
    Display();
    return 0; 
}

5.2 函数表达式调用

函数表达式调用:函数出现一个表达式中

plain
#include<stdio.h>
int AddTwoNum(int Num1,int Num2);
int main()
{
    int Result;
    int Num3 = 10;
    Result = Num3*AddTwoNum(3,5);
    printf("结果为:%d\n",Result);
    return 0;
}
int AddTwoNum(int Num1,int Num2)
{
    int tempResult;
    tempResult = Num1 + Num2;
    return tempResult;
}

5.3 函数参数调用

函数参数调用:将函数返回值作为实参,传递到函数中使用

plain
#include<stdio.h>
int AddTwoNum(int Num1,int Num2);
int main()
{
    int Result;
    Result = AddTwoNum(10,AddTwoNum(3,5));
    printf("结果是:%d\n",Result);
    return 0;
}
int AddTwoNum(int Num1,int Num2)
{
    int TempResult;
    TempResult = Num1 + Num2;
    return TempResult;
}

5.4 嵌套调用

函数定义相互平行,一个函数体内不能定义另一个函数

plain
#include<stdio.h>
void First();
void Second();
void Third();
void Final();
int main()
{
    First();
    return 0;
}
void First()
{
    printf("这是第一步\n");
    Second();
}
void Second()
{
    printf("这是第二步\n");
    Third();
}
void Third()
{
    printf("这是第三步\n");
    Final(); 
}
void Final()
{
    printf("这是最后一步");
}

5.5 递归调用

plain
#include<stdio.h>
void Display(char **a);
char* b[]=
{
    "ABC","DEF","GHI","JKL","end"
};
int main()
{
    Display(b);
    return 0;	
}
void Display(char **a)
{
    if(*a=="end")
    {
        return ;
    }
    else
    {
        Display(a+1);
        printf("%s\n",*a);
    }
}

6.内部函数和外部函数

函数是c语言中最小的单位

6.1 内部函数

内部函数:函数只被所在源文件使用
static 返回值类型 函数名(参数列表)

不同源文件中的相同函数名不会冲突

plain
#include<stdio.h>
static char* Get(char* p)
{
    return p;
}
static void Show(char* p)
{
    printf("%s\n",p);
}
int main()
{
    char *pString;
    pString = Get("Hello!");
    Show(pString);
    return 0;
}

6.2 外部函数

外部函数:可以被其他源文件调用的函数

plain
//文件1
#include<stdio.h>
extern char* GetString(char* p);
extern void Show(char* p);
int main()
{
    char* p;
    p = GetString("Hello!");
    Show(p);
    return 0;
}
//文件2
extern char* GetString(char* p)
{
    return p;
}
//文件3
extern void Show(char* p)
{
    printf("%s\n",p);
}

7.局部变量和全局变量

7.1 局部变量

局部变量:在函数内部定义的变量,无法被其他函数所引用

plain
#include<stdio.h>
int main()
{
    int Num = 1;
    printf("%d\n",Num);
    if(Num>0)
    {
        int Num = 2;
        printf("%d\n",Num);
        if(Num>0)
        {
            int Num = 3;
            printf("%d\n",Num);
        }
        printf("%d\n",Num);
    }
    printf("%d\n",Num);
    return 0;
}

位于不同作用域的变量,可以使用相同的标识符

7.2 全局变量

全局变量:在函数外声明的变量,属于源文件

plain
#include<stdio.h>
int GlobalPrice = 100;
void Price1();
void Price2();
void Price3();
void ChangePrice();
int main()
{
    printf("原始的价格是%d\n",GlobalPrice);
    Price1();
    Price2();
    Price3();
    ChangePrice();
    printf("当前的价格是%d\n",GlobalPrice);
    Price1();
    Price2();
    Price3();
}
void Price1()
{
    printf("一号价格是:%d\n",GlobalPrice);
}
void Price2()
{
    printf("二号价格是:%d\n",GlobalPrice);
}
void Price3()
{
    printf("三号价格是:%d\n",GlobalPrice);
}
void ChangePrice()
{
    printf("你想要更改的价格是什么?请输入:");
    scanf("%d",&GlobalPrice); 
}

8.数学公式

8.1 绝对值

abs函数:求整数绝对值
labs函数:求长整数绝对值
fabs函数:求浮点数绝对值

plain
#include<stdio.h>
#include<math.h>
int main()
{
    int Result1;
    int Num1 = -12;
    long Result2;
    long Num2 = -1234567890L;
    double Result3;
    double Num3 = -123.0;
    Result1 = abs(Num1);
    Result2 = labs(Num2);
    Result3 = fabs(Num3);
    printf("数字1为:%d,绝对值为:%d\n",Num1,Result1);
    printf("数字2为:%ld,绝对值为:%ld\n",Num2,Result2);
    printf("数字3为:%lf,绝对值为:%lf\n",Num3,Result3);	
    return 0;
}

8.2 三角函数

sin函数:求正弦函数
double sin(double x);
cos函数:求余弦函数
double cos(double x);
tan函数:求正切函数
double tan(double x);

plain
#include<stdio.h>
#include<math.h>
int main()
{
    double ResultSin;
    double ResultCos;
    double ResultTan;
    double fXsin = 0.5;
    double fXcos = 0.5;
    double fXtan = 0.5;
    ResultSin = sin(fXsin);
    ResultCos = cos(fXcos);
    ResultTan = tan(fXtan);
    printf("sin%2.1lf的值为:%3.2lf\n",fXsin,ResultSin);
    printf("cos%2.1lf的值为:%3.2lf\n",fXcos,ResultCos);
    printf("cos%2.1lf的值为:%3.2lf\n",fXtan,ResultTan);
    return 0;
}

8.3 字符检测

isalpha函数:检测字母,是字母返回非零
int isalpha(int ch)
isdigit函数:检测数字,是数字返回非零
int isdigit(int ch)
isalnum函数:检测数字或字母,是二者之一返回非零
int isalnum(int ch)

plain
#include<stdio.h>
#include<ctype.h>
void Switch(char c);
int main()
{
    char CharPut;
    char CharTemp;
    printf("第一次输入字符:");
    scanf("%c",&CharPut);
    Switch(CharPut);
    CharTemp = getchar();
    printf("第二次输入字符:");
    scanf("%c",&CharPut);
    Switch(CharPut);
    CharTemp = getchar();
    printf("第三次输入字符:");
    scanf("%c",&CharPut);
    Switch(CharPut);
    return 0;
}
void Switch(char c)
{
    if(isalpha(c))
    {
        printf("你输入的是字母%c\n",c);
    }
    if(isdigit(c))
    {
        printf("你输入的是数字%c\n",c);
    }
    if(isalnum(c))
    {
        printf("你输入的是数字或字母!\n"); 
    }
    else{
        printf("你输入的既不是数字,也不是字母!\n");
    }
}