函数(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;
}