C语言函数
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "funcheader.h" // 自己写的头文件(非C标准库中的头文件),导入时使用双引号,头文件只包含函数原型和常量等,函数定义写在其他.c文件中,该头文件中只包含了一个函数原型clear_input()用于清空输入队列和一个常量CONST1
void func1(void); // 函数原型/函数声明
int main(void)
{
void func2(int j); // 函数原型也可以写在main()函数内的声明变量区域,但应写在首次调用之前
int i = 53;
func2(i); //函数调用,main()为主调函数,func2()为被调函数,变量i的值53为实参,实参是值,不是变量
printf("%d\n", CONST1); // 调用头文件中定义的常量
double d1 = 2.3;
double d2 = 4.4;
larger_of(&d1, &d2); // d1为变量,&d1表示变量的地址/指针,&d1为常量,因为变量的地址是固定的,被调函数想要改变主调函数内的变量的值需要将主调函数的变量的地址传参给被调函数,在被调函数中通过地址更改变量
printf("%.2f %.2f\n", d1, d2);
printf("%.2f\n", power(3.2, 5));
to_base_n(76332, 6); // 使用递归将一个数转换为6进制
printf("\n");
return 0;
}
void func1(void) // 函数定义,提供实际的代码/实现。不同于函数声明告知编译器函数的类型
{
printf("func1");
}
void func2(int j) // 函数头 ,j为形参
{ // 函数体
printf("%d\n", j);
j = 2; // 函数在调用时创建了int类型的j变量/形参,并初始化为主调函数中变量(表达式)i的值,所以变量j不是i,变量j初始化为i的值(相当于备份),j是形参,i的值是实参
}
void larger_of(double* x, double* y) // 声明指向double类型的指针,声明指针变量的格式为 类型 * 变量名,星号不再是乘号的作用,是解引用运算符,x是指向变量d1地址的指针(x = &d1),y是指向变量d2地址的指针(y = &d2),指针的值是地址
{
*x = *x > *y ? *x : *y; // *x表示指针x指向的地址的值,即d1的值,x指向的地址为变量d1的地址,*x为该地址的值即d1的值,*y为d2的值,通过赋值运算更改*x的值,即可更改主调函数中d1变量的值
*y = *x;
}
void to_base_n(int num, int j)
{
if (j < 2 || j > 10)
{
printf("j must in 2-10");
return; // 无返回值的函数使用return;将控制转回主调函数
}
int show = num % j;
num = num / j;
if (num >= j)
to_base_n(num, j); // 递归,调用自身
else
printf("%d", num); //打印j进制数的第一位
printf("%d", show); // 在递归之前的操作随递归层数顺序执行,在递归之后的操作为逆序执行,最深层递归先执行,返回上一层递归再执行,所以最外层的余数最后打印
}