C语言笔记-函数

函数

1.1函数的作用

  1. 避免重复代码的编写
  2. 使程序模块化

1.2简单函数示例

include<stdio.h>
    
void starbar(void);//函数在调用前需要进行声明,也可以放在main()的内部。(**函数原型**)

/*主程序部分*/    
int main(void)   
{
    starbar();//**函数调用**
    printf("姓名:A");
    printf("年龄:18");
    printf("升高:180");
    printf("体重:52");
    starbar();//**函数调用**
    return 0;
}

/*函数的定义*/  
// 输出40个 *
void starbar(void)  
{
    int count;
    for(count=1;count<=40;count++)
        putchar('*');
    putchar('\n');
}
  • 函数原型:告知编译器 starbar()的函数类型

  • 函数调用:导致该函数的执行

  • 函数的定义:支出函数确切的功能

  • 任何程序在使用函数之前都必须声明该函数的类型

    void starbar(void);
    

    第一个 void 指的是函数的类型;它的意思是函数没有返回值。

    括号内的 void 表示不接受任何参数

    分号(” ;“)的作用是表示这是函数的声明,不是函数的定义

  • 函数定义的时候 void starbar(void) 没有分号

  • 函数内部定义的变量属于***局部变量***,只在函数内部有用

  • 函数可以和主函数写在一个文档中容易编译,也可以写成两个文档方便其它主函数进行调用,函数和主程序写成两个文件时,还需要写一个 名称 . h 声明文件作为头文件,在函数文件和主程序中进行 声明 调用 名称 . h名称 . h 中包含 #define 定义的常量 以及函数的声明 ,常量是在两个文件中都使用到的,这样,在主程序和函数文件前加上 #include " 名称 . h" 即可调用声明文件

    文件一,主程序文件;main.c

    include<stdio.h>
    include"name.h" //声明文件
    int main(void)
    {
        return;
    }
    

    文件二,函数文件;fun.c

    include<stdio.h>
    include"name.h" //声明文件
    void fun1(void)
    {
        return;
    }
    int fun2(int)
    {
        return;
    }
    float fun3(int)
    {
        return;
    }
    

    文件三,声明文件,state.h

    /*声明文件,state.h*/
    #define AAA 1
    #define BBB 2
    #define CCC 3
    
    void fun1(void);
    void fun2(void);
    void fun3(void);
    

1.3 函数参数

在上一个程序中,我们调用的函数并没有输入参数,下面进行一个简单地改进;

要求是我们可以控制输出的字符数的 数量字符 的类型。

include<stdio.h>
include<string.h>  

#define NAME "abcdefg"    
#define ADDRESS "101 bbbBBB palze"  
#define PLACE "APPLE, china ,2022"  
#define SPACE " "    
    
void show_n_char(char ch,int num);//函数在调用前需要进行声明,也可以放在main()的内部。(**函数原型**)

/*主程序部分*/    
int main(void)   
{
    int spaces;
    
    show_n_char("*",40);//**函数调用**
    putchar("\n");
    show_n_char(SPACE,12);
    printf("%s\n",NAME);
    
    spaces = (40-strlen(ADDRESS))/2;
    show_n_char(SPACE,spacs);//**函数调用**
    printf("%s\n",ADDRESS);
    
    show_n_char(SPACE,(40-strlen(PLACE))/2);
    printf("%s\n",PLACE);
    show_n_char("*",40);//**函数调用**
    putchar("\n");
    
    return 0;
} 

/*函数的定义*/  
void show_n_char(char ch,int num) 
{
    int count;
    for(count=1;count<=num;count++)
        putchar(ch);
}

函数定义由一下语句实现

void show_n_char(char ch,int num) 

使用了 chnum 两个参数,并分别定义了他们的参数类型为 charnum ,称为形式参量,即 形参

由于该函数没有返回值,所以函数类型为 void

1.4 有返回参数的函数

int imin(int a,int b)
{
    int min;
    min = ( a<b ? a : b);
    return min ;
}

return 指明其后面的表达式即为返回值,上面的函数还可以简化为一下形式:

int imin(int a,int b)
{
    return ( a<b ? a : b);
}

由于返回值是一个 int 类型 ,所以函数类型定义为 int

函数的类型指的是返回值的类型

1.5 递归

1.5.1 递归的概念

一个函数调用其本身,这种调用的过程称为递归-----其执行效率没有循环高

1.5.2 递归程序示例

/*递归举例*/
#include<stdio.h>
void up_and_down(int);

int main(void)
{
    up_and_down(1);
    return 0;
}

void up_and_down(int n)
{
    printf("level &d :n location %p\n",n,&n);/*1*/
    if(n<4)
        up_and_down(1+n);
    printf("level &d :n location %p\n",n,&n);/*2*/
}

在主程序中,当调用 up_and_down() 时,将 1 传入函数,此时执行/1/语句输出 level 1

此时满足 if 执行条件,再一次调用up_and_down (),称为第一级,将1+1输入函数,输出level 2

在第一级中,此时输入值为2,仍然满足 if 执行条件,再一次调用up_and_down (),称为第二级,将2+1输入函数,输出level 3

在第二级中,此时输入值为3,仍然满足 if 执行条件,再一次调用up_and_down (),称为第三级,将3+1输入函数,输出level 4

在第三级中,此时输入值为4,不满足 if 执行条件,此时执行/2/,输出level 4,并返回上一级;

在第二级中,此时输入值为3,if 语句完成执行,开始执行/2/,输出level 3,并返回上一级;

在第一级中,此时输入值为2,if 语句完成执行,开始执行/2/,输出level 2,并返回上一级;

首次 if 语句已经执行结束,此时输入值为1,开始执行/2/,输出level 1 ,执行结束

注意:递归函数中必须含有可以终止递归调用的语句

/*递归求阶乘*/
long fact(int n)
{
    long ans;
    if(n>0)
        ans=n*fact(n-1);
    else
        ans=1;
    return ans;
}
/*递归将十进制转换成二进制*/
include<stdio.h>

void to_binary(int n);

int main(void)
{
    unsigned long number;
    printf("请输入要转换成二进制的数,结束请输入任何非数字字符\n");
    while(scanf("%ul",&number)==1)
    {
        printf("%ul的二进制数是",number);
        to_binary(number);
        printf("请输入要转换成二进制的数,结束请输入任何非数字字符\n");
    }
    printf("bye!");
    return 0;
}

void to_banary(int n)
{
    int r;
    r=n%2;
    if(n>=2)
        to_banary(n/2);
    printf('0'+r);
    return;
}

1.6 指针简介

地址运算符 & ,后面跟一个变量名时,& 给出该变量的地址

间接运算符 *** ,后面跟一个 指针名 或者 一个 地址 的时候, * 给出储存在被指向地址中的数值

int bah=5;
int *ptr;
ptr = &bah ;
val = *ptr ;

ptr 指向 bah地址

val 获取地址中数值

指针声明表示如下:

int * pi;			/*pi是指向一个整数变量的指针*/
char * pc;			/*pc是指向一个字符变量的指针*/
float * pf , * pg ;	/*pf 和 pg 是指向一个浮点变量的指针*/

用指正进行通过函数交换两个数

#include<stdio.h>
void interchange(int *u,int *v);
int main(void)
{
    int x=5,y=10;
    printf("原始数据x=%d,y=%d\n",x,y);
    interchange(&x,&y);
    printf("现在的数据x=%d,y=%d\n",x,y);
    return 0;
}

void interchange(int *u,int *v)
{
    int temp;
    temp = *u;
    *u=*v;
    *v=temp;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值