不多废话,先说函数定义,分为两种:
- 库函数:C语言内部提供的函数;
- 自定义函数:自己写的函数。
本文主要讲自定义函数,也就是如何自己实现函数的编写。
自定义函数,包括:函数名、参数、返回形式。
简单举例,比较两整数的大小,返回大数。
#include <conio.h>
#include <stdio.h>
int who_is_big(int num1, int num2)
{
if (num1 >= num2)
{
return num1;
}
else
{
return num2;
}
}
int main()
{
int a=0, b=0;
printf("input two int number:");
scanf_s("%d %d", &a, &b);
int result = who_is_big(a, b);
printf("big number is:%d", result);
_getch();
return 0;
}
函数的参数
实参
真实传给函数的参数,叫实参。比如常量、变量、表达式、函数等。调用函数时,它们都必须有确定的值,以便把这些值传送给形参。
int a=0, b=0;
//a和b是实参
形参
形式参数是指函数名后括号中的变量,只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。因此形式参数只在函数中才有效。
int who_is_big(int num1, int num2)
//num1和num2就是形参
函数调用
传值调用
#include <conio.h>
#include <stdio.h>
int add_two_num(int num1, int num2)
{
return num1 + num2;
}
int main()
{
int a=0, b=0;
printf("input two int number:");
scanf_s("%d %d", &a, &b);
int result = add_two_num(a, b);
printf("The sum of two numbers is:%d", result);
_getch();
return 0;
}
传址调用
首先看个例子,交换两个整数
#include <conio.h>
#include <stdio.h>
void change_two_num(int num1, int num2)
{
int temp_num = 0;
temp_num = num1;
num1 = num2;
num2 = temp_num;
}
int main()
{
int a=0, b=0;
printf("input two int number:");
scanf_s("%d %d", &a, &b);
printf("交换前:a=%d,b=%d\n", a, b);
change_two_num(a, b);
printf("交换后:a=%d,b=%d\n", a, b);
_getch();
return 0;
}
交换失败!!!
why???
形参只是实参的一份临时拷贝,在整个函数中我们改变的只是实参,出函数后形参被销毁无法改变实参。
此时就用到了传址调用,传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
修改代码如下:
#include <conio.h>
#include <stdio.h>
void change_two_num(int* num1, int* num2)
{
int temp_num = 0;
temp_num = *num1;
*num1 = *num2;
*num2 = temp_num;
}
int main()
{
int a=0, b=0;
printf("input two int number:");
scanf_s("%d %d", &a, &b);
printf("交换前:a=%d,b=%d\n", a, b);
change_two_num(&a, &b);
printf("交换后:a=%d,b=%d\n", a, b);
_getch();
return 0;
}
交换成功!
记住:传址调用的程序传递的是实参的地址,这是实参的本质属性。