C语言学习笔记—函数的定义、调用、参数传递

本文详细介绍了C语言中的函数概念,包括函数的定义、调用方式、参数传递机制及不同类型函数的应用实例。通过生动的例子帮助读者理解函数的工作原理。

一、什么是函数?

为了方便说明我们先引入一个约会的场景例子:
约会

#include <stdio.h>
#include <stdlib.h>
int prepare()
{
	printf("出门前准备中!\n");
    printf("穿衣洗漱!\n");
    printf("准备完毕!\n");
	return 0;
}
int inDiDi(){
	printf("打开手机!\n");
	printf("打开滴滴!\n");
	printf("发布订单!\n");
	printf("等待司机!\n");
    return 0;`
}
int onTheRoad()
{
	printf("在路上!\n");
	printf("订饭店!\n");
    printf("打滴滴中!\n");
	inDiDi();
    printf("通知女神!\n");
    printf("路上的事情准备完毕!\n");
	return 0;
}
int datting()
{
	
	printf("约会中!\n");
    printf("吃饭中!\n");
    printf("看电影中!\n");
    printf("逛街中!\n");
    printf("约会完毕!\n");
	return 0;
}
int goBackHome()
{
	int mark = 0;
    printf("回家中!\n");
    if(mark == 0){
	printf("上不了楼,拥抱一下,告别!\n");
    }else{
    printf("跟她回家!\n");
    }
	return 0;
}


int main()
{

	//以下自定义函数,需要把函数做出来
	prepare();//出门前的准备
    
    onTheRoad();//在路上
    
	datting();//见面
    
    goBackHome();//回家
	system("pause");
	return 0;
}

函数是C语言程序的基本组成单位,是完成某一个特定功能的独立程序模块,包括库函数和自定义函数两种。我们在之前的程序中用到的printf();\scanf()等就是库函数,由C语言系统提供定义编程时直接调用即可。
而自定义函数就想上边例子中的prepare()、inDiDi()、onTheRoad()、datting()、goBackHome()这些,我们自己编写来实现不同功能的模块叫做自定义函数。即需要用户自己定义的函数为自定义函数。

二、如何定义函数?

函数的定义的一般形式
函数类型 函数名 (形式参数表)  //函数首部
{
	实现过程				  //函数体
}

函数首部
  1. 函数首部由函数类型、函数名、形式参数表组成。
  2. 函数类型值得是函数结果返回的类型。与return语句中表达式的类型一致。
  3. 形式参数表是用来给出函数运行索要需要的相关已知条件;多个形参用逗号隔开,每个形参都声明类型。
函数体

用来体现函数的实现过程,由一对大括号内的若干条语句组成,并用return语句返回结果 (结果的类型要与函数类型一致)

例:

int goBackHome()
{
	int mark = 0;
    printf("回家中!\n");
    if(mark == 0){
	printf("上不了楼,拥抱一下,告别!\n");
    }else{
    printf("跟她回家!\n");
    }
	return 0;
}

三、如何调用函数?

函数的一般调用形式
函数名(实际参数);
//例:
#include <stdio.h>
#include <stdlib.h>
void buyRice2(int jinshu){
printf("买%d斤米!\n",jinshu);
printf("%p\n",&jinshu);
jinshu++;
printf("%d\n",jinshu);

}
int main()
{
	int a = 10;
    buyRice2(a);
    printf("%p\n",&a);
    printf("%d\n",a);
	system("pause");
	return 0;
}
函数调用的过程

说到函数的调用,那我们就得提到函数的调用过程,首先我们知道任何C程序的执行到要从main()函数开始,在main()函数得执行过程中遇到了函数调用,那么主函数会被暂停执行,转而执行相应的函数,执行完成后再返回主函数继续向下执行

参数传递

函数定义时其首部的参数就叫形参例如上边例子中buyRice2函数首部的"jinshu",而主调函数的参数则被称为实参,实参是实际参与函数体执行的参数,如main函数里的buyRice2(a);中的“a”。
另外需要注意的就是:

  1. 形参和实参必须一一对应,顺序一致,两者数量相同。
  2. 类型尽量一致。
  3. 函数的形参必须是变量。
  4. C语言规定在参数传递中,将实参的值赋值给形参,这是一种单向传递,也就意味着形参的值得改变不会影响实参
  5. 函数中return的作用有两个,一个是结束函数的运行,二十带着结果返回主调函数。且return只能返回一个值
形式参数和局部变量的区别
#include <stdio.h>
#include <stdlib.h>

//1.形式参数作用域仅限于该函数
//2.形式参数有自己的内存空间
/*a.空间的生存期
  b.何时申请了该空间
  c.当该函数被调用的时候,才申请了内存地址空间,才有了这个变量;
  d.同时这个空间内的数据被赋值成为实际参数的值;函数调用把实际参数的值拷贝一份给形式参数
  e.何时释放了该空间
  f.函数执行结束后,该空间由内存管理单元自动回收(释放)*/
void buyRice2(int jinshu){
//jinshu是局部变量也是形式参数,他的作用域仅限该函数

printf("买%d斤米!\n",jinshu);
printf("%p\n",&jinshu);
jinshu++;
printf("%d\n",jinshu);

}

int main()
{
	int a = 10;
	
    buyRice2(a);
    printf("%p\n",&a);
    printf("%d\n",a);
	system("pause");
	return 0;
}

这里还有一个例子:

#include <stdio.h>
#include <stdlib.h>

void test(){
	int data = 100;
    printf("data = %d\n",data);
}
void test2(){
	int data = 101;
    printf("data = %d\n",data);
}
void test3(){
	int data = 102;
    printf("data = %d\n",data);
}
int main()
{
	test();
    test2();
    test3();
	system("pause");
	return 0;
}

四、一般定义函数的几种情况

无返回值无参数
#include <stdio.h>
#include <stdlib.h>

void buyRice(){

	printf("去买米\n");

}
void printScreen(){

	printf("*-----------------------*\n");
	printf("*                       *\n");
	printf("*                       *\n");
	printf("*----------Marry--------*\n");
	printf("*                       *\n");
	printf("*                       *\n");
	printf("*-----------------------*\n");
}
int main()
{
    buyRice();
    printScreen();
	system("pause");
	return 0;
}
  1. void代表无返回值,不需要return
无返回值有参数
#include <stdio.h>
#include <stdlib.h>

void buyRice2(int jinshu){

printf("买%d斤米!\n",jinshu);
printf("%p\n",&jinshu);
jinshu++;
printf("%d\n",jinshu);

}

int main()
{
	int a = 10;
	
    buyRice2(a);
    printf("%p\n",&a);
    printf("%d\n",a);
	system("pause");
	return 0;
}

有返回值有参数、有返回值有多个同类型参数
#include <stdio.h>
#include <stdlib.h>

int add(int x,int y){
	int z;
    z = x + y;
	return z;

}
int min(int x,int y){
	int z;
    z = x - y;
	return z;

}
int cheng(int x,int y){
	int z;
    z = x * y;
	return z;

}
int chu(int x,int y){
	int z;
    z = x / y;
	return z;

}
int main()
{
	int data;
	int data2;
    int ret;
    
    while(1){
		printf("请输入第一个数据:\n");
        scanf("%d",&data);
		printf("请输入第二个数据:\n");
        scanf("%d",&data2);
        ret = add(data,data2);
        printf("结果:%d + %d = %d",data,data2,ret);
        ret = min(data,data2);
        printf("结果:%d - %d = %d",data,data2,ret);
        ret = cheng(data,data2);
        printf("结果:%d * %d = %d",data,data2,ret);
        ret = chu(data,data2);
        printf("结果:%d / %d = %d",data,data2,ret);
    }
	system("pause");
	return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值