C语言--函数

C语言——第五章函数

  • 引言
    • 1.函数的嵌套调用
    • 2.全局变量的使用
    • 3.setjmp与longjmp
    • 4.n的阶乘的递归调用实现
    • 5.汉诺塔问题的递归实现
    • 6.局部变量与全局变量
    • 7.自动变量
    • 8.指针swap函数调用
  • 总结

引言

C语言的一些基本例题
全部例题来自于C语言王道训练营 链接如下

B站链接.
书籍:《跟“龙哥”学C语言编程》

1.函数的嵌套调用

func.h

#include<stdio.h>
#include<stdlib.h>
//函数声明
int printstar(int i);
void print_message();

func.c

#include"func.h"
//函数具体内容
int printstar(int i)
{
	printf("***********\n");
	printf("printstart %d\n", i);
	return i + 3;
}
void print_message()
{
	printf("how do you do\n");
	printstar(3);
}

main.c

#include"func.h"
int main()
{
	int a = 10;
	a = printstar(a);
	print_message();
	printstar(a);
	system("pause");
	return 0;
}

运行结果

***********
printstart 10
how do you do
***********
printstart 3
***********
printstart 13
请按任意键继续. . .

2.全局变量的使用

下面展示一些 可运行的代码

#include<stdio.h>
#include<stdlib.h>
//全局变量i存储在数据段,所以main函数和print函数都是可见的
int i = 10;//全局变量
void print(int i)
{
	//如果局部变量与全局变量重名,那么将采取就近原则,即实际获取和修改的值是局部变量的值。
	i = 20;
	printf("print i=%d\n", i);
}
int main()
{
	printf("main i=%d\n", i);
	i = 5;
	print(i);
	system("pause");
	return 0;
}

运行结果

main i=10
print i=20
请按任意键继续. . .

3.setjmp与longjmp

下面展示一些 可运行的代码

#include<stdio.h>
#include<stdlib.h>
#include<setjmp.h>
jmp_buf envbuf;
//我们的进程执行到setjmp位置时,通过setjmp函数保存了进程的上下文(处理器运行进程期间,运行进程的信息被存储在处理器的寄存器和高速缓存中,执行的进程被加载到寄存器的数据集被称为上下文),所以当执行到函数b时,可以通过longjmp恢复envbuf的操作
void b()
{
	printf("I am b func\n");
	longjmp(envbuf, 5);//回到setjmp位置
}
void a()
{
	printf("before b(),I am a func\n");
	b();
	printf("after b(),I am a func\n");
}
int main()
{
	int i;
	i = setjmp(envbuf);
	if (i == 0)
	{
		a();
	}
	system("pause");
	return 0;
}

运行结果

before b(),I am a func
I am b func
请按任意键继续. . .

4.n的阶乘的递归调用实现

下面展示一些 可运行的代码

#include<stdio.h>
#include<stdlib.h>
//求n的阶乘
int f(int n)
{
	if (n == 1)
	{
		return 1;
	}
	return n * f(n - 1);
}
//走楼梯
int step(int n)
{
	if (1 == n)
	{
		return 1;
	}
	if (2 == n)
	{
		return 2;
	}
	return step(n - 1) + step(n - 2);
}
int main()
{
	int n;
	int ret;
	scanf("%d", &n);//输入数字大小
	ret = f(n);
	printf("%d的阶乘为%d\n",n, ret);
	scanf("%d", &n);//输入台阶数
	ret = step(n);
	printf("%d上楼梯的方法有%d\n",n, ret);
	system("pause");
	return 0;
}

运行结果

10
10的阶乘为3628800
5
5上楼梯的方法有8
请按任意键继续. . .

5.汉诺塔问题的递归实现

下面展示一些 可运行的代码

#include<stdio.h>
#include<stdlib.h>
//定义hanoi函数,将n个盘从第one柱接触第two柱,移到第three柱
void hanoi(int n, char one, char two, char three)
{
	void move(char x, char y);//对move函数的声明
	if (1 == n)
	{
		move(one, three);
	}
	else {
		hanoi(n - 1, one, three, two);
		move(one, three);
		hanoi(n - 1, two, one, three);
	}

}
void move(char x, char y)
{
	printf("%c-->%c\n", x, y);
}
int main()
{
	void hanoi(int n, char one, char two, char three);
	//对hanoi函数的声明
	int m;
	printf("input the number of diskes:");
	scanf("%d", &m);
	printf("The step to moveing %d diskes:\n", m);
	hanoi(m, 'A', 'B', 'C');
	system("pause");
	return 0;
}

运行结果

input the number of diskes:3
The step to moveing 3 diskes:
A-->C
A-->B
C-->B
A-->C
B-->A
B-->C
A-->C
请按任意键继续. . .

6.局部变量与全局变量

下面展示一些 可运行的代码
func.h

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

void print();

func.c

#include "func.h"
//用extern来声明外部变量,以扩展外部变量的作用域。
extern int k;//借用main.c文件的全局变量k
//static修饰的函数,函数只能在本函数、本文件中使用
void print()
{
	static int t = 0;//只能初始化一次
	t++;
	printf("print excute %d\n", t);
	printf("print k=%d\n", k);
}

main.c

#include"func.h"
extern int k;
void print1()
{
	printf("print1 k=%d\n", k);
}
int k = 10;//static修饰全局变量,该变量不能被其他文件借用
//定义全局变量k时加上static后func.c无法借用
int main()
{
	int i = 10;
	{
		int j = 5;
		//局部变量的有效范围是离自己最近的花括号
	}
	printf("i=%d k=%d\n", i, k);
	print();
	print1();
	system("pause");
	return 0;
}

运行结果

i=10 k=10
print excute 1
print k=10
print1 k=10
请按任意键继续. . .

7.自动变量

下面展示一些 可运行的代码

#include<stdio.h>
#include<stdlib.h>
//函数每次调用结束后,其内部使用的局部变量空间就会被释放,下次调用add函数时,i会被重新分配空间。
void add()
{
	static int j = 0;
	auto int i = 0;
	i = i + 1;
	j = j + 1;
	printf("i=%d j=%d\n", i,j);
}

int main()
{
	printf("第一次执行:\n");
	add();
	printf("第二次执行:\n");
	add();
	system("pause");
	return 0;
}

运行结果

第一次执行:
i=1 j=1
第二次执行:
i=1 j=2
请按任意键继续. . .

8.指针swap函数调用

下面展示一些 可运行的代码

#include<stdio.h>
#include<stdlib.h>
void swap(int* a, int* b)
{
	int c;
	c = *a;
	*a = *b;
	*b = c;
}
int main()
{
	int a, b;
	int *p, *q;
	a = 16;
	b = 64;
	p = &a;
	q = &b;
	swap(p, q);
	printf("*p=%d,*q=%d\n", *p, *q);
	//swap(&a, &b);
	printf("a=%d,b=%d\n", a, b);
	system("pause");
	return 0;
}

运行结果

*p=64,*q=16
a=64,b=16
请按任意键继续. . .

总结

第一次发表一篇完整的博客,对于一些遗漏,读者不要太过深究~
比较适合新手打基础大佬请绕路~
希望这些可以帮助你更好的理解C语言
马上就考研了 我居然还在纠结一些基础 真是闲的闲的闲的闲*10000!
过几天在更新后几章的内容
欢迎大家评论收藏点赞 !!!

你可能感兴趣的:(c语言)