Skip to content

函数(2)

1062字约4分钟

2024-07-07

57.extern用法(1)

#include <stdio.h>
extern int A;         //extern可以在文件内扩展一个全局变量的作用域,extern只能修饰全局变量
int main(void)
{
	printf("%d\n",A);
	return 0;
}
int A =10;

58.extern用法(2)

#include <stdio.h>
extern int A;          //extern可以将全局变量的作用域扩展到其他文件①在不同的文件中不可以有重名的非静态的全局变量②编译时遇到extern先在本文件中搜寻
extern int B;
extern int *p;
int main(void)
{
	printf("%d\n",A);
//	pritnf("%d\n",B); error因为B是静态外部变量,不可以在其他文件中通过变量名来引用它
	printf("%d\n",*p);   //可以通过指针间接的引用其他文件中的静态全局变量
	return 0;
}
//static int A = 14;

59.static局部变量

//静态局部变量是在编译的时候初始化,即只复制一次,不会随函数调用结束后其存储单元自行消失
//自动变量是在函数调用时赋初值的,调用一次,赋一次,调用结束后其存储单元就消失
#include <stdio.h>
int *p;
void f(void)
{
	int i =10;
	static int j;            //如果定义静态局部变量的时候没有初始化,它将有一个默认值0
	printf("%d,%d\n",i++,j++);
	p=&j;
}


int main(void)
{
//	printf("%d\n",j);  error因为j的作用域不在此
	f();
	f();
	f();
	printf("%d\n",*p);  //可以通过指针引用在其他函数定义的静态局部变量
	return 0;
}


##

60.1内部函数和外部函数

//①在不同的文件中不可以有重名的外部函数定义②函数声明 先从本文件中寻找函数定义,找不到,再从其他文件中寻找外部函数的定义
#include <stdio.h> //因为f函数需要用到printf语句
extern void f(void);
void g(void);
extern void (*p)(void);
int main(void)
{
	f();
//	g();  error 如果想正常运行该语句,g函数要么定义在本文中,那么是定义在其他文件的外部函数,我们不能企图调用一个来自其他文件中定义的内容
	(*p)();  //可以通过函数的指针间接调用其它文件中定义的内部函数
	return 0;
}
static void f(void)
{
	printf("1111\n");
}

60.2变量的存储方式和生存期

变量的存在时间即生存期,在程序运行整个过程中都存在的变量是在内存大静态存储区存放的;有的变量则是在调用其所在的函数时才临时分配存储单元,调用结束后该存储单元被释放,这种变量是存放在内存的动态存储区的。

关键词可修饰变量类型内存的存储位置
auto(可省)局部变量动态存储区
register(好的编译器可自动优化,所以基本不用)局部变量动态存储区
extern(可省略数据类型名)全局变量静态存储区
static局部变量,全局变量静态存储区

建立存储空间的声明是定义声明(如 int a;),不需要建立存储空间的声明是引用声明

61.undef,extern小知识点

#include <stdio.h>
#undef AB
#undef AB        //可以终止同一个宏名的作用域,即使这个宏名没有被定义
extern int a;
extern int a;    //可以多次扩展同一个全局变量的作用域,即使这个变量没有被定义
void f(void);
void f(void);    //可以多次扩展同一个函数的作用域,即使这个函数没有被定义
int main(void)
{
	return 0;
}

62.递归——求5的阶乘

#include <stdio.h>
int f(int a)
{
	if(a ==1 || a ==0)
		return 1;
	else if(a>1)
		return a*f(a-1);
	else
		return -1;
}
int main(void)
{
	printf("%d\n",f(5));
	return 0;
}

63.递归求汉诺塔

#include <stdio.h>
void f(char a,char b)
{
	printf("%c柱子上往%c柱子上挪动一个圆盘\n",a,b);
}
void g(int i,char a,char b,char c)
{
	if(i == 2)
	{
		f(a,b);
		f(a,c);
		f(b,c);
	}
	else if(i>2)
	{
		g(i-1,a,c,b);
		f(a,c);
		g(i-1,b,a,c);
	}
}
int main(void)
{	
	g(3,'A','B','C');
	return 0;
}