C语言函数概述和参数传递

基础知识

  C语言中函数是将一组语句封装为一个独立代码块的实现方法。在语法层次上包含3个概念:函数声明,函数调用和函数返回。

函数声明

  包括函数定义性声明和函数引用性声明。

  • 一个程序包含的所有函数定义可按任意次序保存在一个规定扩展名的源文件中,也可以经分割后保存在多个源文件中,不允许将一个函数定义分割开保存在多个源文件中。
  • 不允许同一程序中出现同名的自定义函数,但自定义函数可以与库函数同名,不允许自定义函数名与全局变量同名。
  • 若定义一个形参时使用了const限定,则表示函数体中不允许改变该形参的值。

函数调用

  调用函数称为主调函数,被调用函数称为被调函数,每个函数都可以调用其他函数,或被其他函数调用,或进行递归。

  • 直接调用:用函数名、圆括号和实参表达式调用函数。

  ①编译时系统会检查函数调用中实参个数是否与被调函数形参个数匹配;

  ②函数调用中实参类型会被自动转换为对应形参类型;

  ③函数调用时先求实参表达式的值,但求值顺序不同编译器可能不同。

函数名()
函数名(实参表达式)
  • 间接调用:用指向函数的指针、圆括号及参数表达式调用函数。函数名既代表函数符号,也代表该函数的起始地址。函数名是一个指针类型的常量。若将函数名保存到一个指针变量中,这个指针变量就指向特定函数。
声明:函数返回值类型 (*指针变量名)(形参类型表)
调用:指针(实参表)或(*指针)(实参表)
#include<stdio.h>
#include<math.h>
int main(void)
{
    double (*pf)(double, double);
    pf=pow;
    printf("%f", pf(2,3));
    return 0;  
}

函数返回

  函数返回通过return实现。return语句有三个用途。

  • 结束函数的执行并返回到主调函数;
  • 向主调函数返回一个函数类型的返回值;
  • 归还函数定义中定义的局部变量的储存空间。

函数调用时的参数传递

  传递数值:传递给形参的应是与实参兼容的基本数据类型,这里不再赘述。

  传递地址:实参向形参传递的应是与其形参的基类型相同的对象的地址。

#include<stdio.h>
void swap(int *x,int *y)
{
    int t;
    t=*x;
    *x=*y;
    *y=t;
}

int main()
{
    int a=1,b=2;
    swap(&a,&b);
    printf("a=%d,b=%d",a,b);
}

  传递函数地址:调用函数时,向形参传递对应的返回值类型为T的函数的地址,函数名或指向函数的指针均可以被用做实参。被调函数通过该类型指针类型形参可以间接调用其他函数。

#include<stdio.h>
#inlcude<math.h>
double root(double a,double b,double eps,double (*pf)(double))
{
    double c;
    while(1){
        c=(a*pf(b)-b*pf(a))/(pf(b)-pf(a));
        if(fabs(pf(c))<eps||fabs(b-a)<eps)
            return c;
        if(pf(a)*pf(c)<0)
            b=c;
        else
            a=c;
    }
}
double f(double x)
{
    return 6-x*(5-x*(4-3*x));
}
int main()
{
    printf("x=%lf",root(1,2,1e-6,f));
}
//也可以将root函数首部写成double root(double a,double b,double eps,double pf(double))
posted @ 2021-05-12 09:57  结城梨斗  阅读(456)  评论(0)    收藏  举报