2个回答
展开全部
首先说一下什么是静态变量(常量也是一样的道理),你可以这么理解,不管哪声明的静态变量,其实都可以当作全局变量,但和普通的全局变量不同的是该静态变量只能在其声明的作用域中使用,出了这个作用域就不能用了。
那么你的问题也就出来了,在函数内声明的静态变量其实就是一个全局变量,只不过它只能在函数内部用;在函数外声明的,有两种,一种是类中的成员(C++的概念,既然你问c这里就不赘述了),另外一种就是文件作用域的静态变量,有文件作用域的静态变量只能在包含它的.c文件中使用,如果是声明在头文件中的静态变量,那么在不同的.c文件包含它的时候,会各自生成一个独立的副本,也就是说每个包含它的.c文件中的该变量其实是互不相干的;而有文件作用域的静态变量和在当前.c文件下全局变量是一样的,不一样的是其他.c中的情况。
那么在函数内声明的静态变量和函数中的局部变量有什么区别呢?区别就是静态变量只有第一次运行函数的时候被创建,并且在函数结束的时候不会消亡;而普通的成员在函数结束的时候就会在内存中退栈消亡。
说了那么多,举个例子:
//Ex_1.c
void fun_1 ()
{
static int a = 0;
a ++;
printf ("%d", a);
}
void fun_2 (int times)
{
int i = 0;
for (;i < times; i++)
{
fun_1 ();
}
}
之后再执行fun_2的话,就会依次打印:12345....直到times;
如果去掉static关键字,执行fun_2,屏幕就会打印111111...次数为times次;
下面举例说明一下函数外的:
//H.h
#ifndef _H_H_
#define _H_H_
static int a = 0;
#endif
//Ex_2.c
#include "H.h"
void fun_ex2 ()
{
a++;
printf ("%d", a);//这时会打印1
}
//Ex_3
#include "H.h"
void fun_ex3 ()
{
printf ("%d", a);//这时打印的依然是0,即便先被Ex_2中的fun_ex2()函数修改过,因为他们
//是两个独立的副本
}
额,说的太啰嗦了,希望你明白了哈~~~
那么你的问题也就出来了,在函数内声明的静态变量其实就是一个全局变量,只不过它只能在函数内部用;在函数外声明的,有两种,一种是类中的成员(C++的概念,既然你问c这里就不赘述了),另外一种就是文件作用域的静态变量,有文件作用域的静态变量只能在包含它的.c文件中使用,如果是声明在头文件中的静态变量,那么在不同的.c文件包含它的时候,会各自生成一个独立的副本,也就是说每个包含它的.c文件中的该变量其实是互不相干的;而有文件作用域的静态变量和在当前.c文件下全局变量是一样的,不一样的是其他.c中的情况。
那么在函数内声明的静态变量和函数中的局部变量有什么区别呢?区别就是静态变量只有第一次运行函数的时候被创建,并且在函数结束的时候不会消亡;而普通的成员在函数结束的时候就会在内存中退栈消亡。
说了那么多,举个例子:
//Ex_1.c
void fun_1 ()
{
static int a = 0;
a ++;
printf ("%d", a);
}
void fun_2 (int times)
{
int i = 0;
for (;i < times; i++)
{
fun_1 ();
}
}
之后再执行fun_2的话,就会依次打印:12345....直到times;
如果去掉static关键字,执行fun_2,屏幕就会打印111111...次数为times次;
下面举例说明一下函数外的:
//H.h
#ifndef _H_H_
#define _H_H_
static int a = 0;
#endif
//Ex_2.c
#include "H.h"
void fun_ex2 ()
{
a++;
printf ("%d", a);//这时会打印1
}
//Ex_3
#include "H.h"
void fun_ex3 ()
{
printf ("%d", a);//这时打印的依然是0,即便先被Ex_2中的fun_ex2()函数修改过,因为他们
//是两个独立的副本
}
额,说的太啰嗦了,希望你明白了哈~~~
展开全部
区别就是静态变量只有第一次运行函数的时候被创建,并且在函数结束的时候不会消亡;而普通的成员在函数结束的时候就会在内存中退栈消亡。
//Ex_1.c
void fun_1 ()
{
static int a = 0;
a ++;
printf ("%d", a);
}
void fun_2 (int times)
{
int i = 0;
for (;i < times; i++)
{
fun_1 ();
}
}
之后再执行fun_2的话,就会依次打印:12345....直到times;
如果去掉static关键字,执行fun_2,屏幕就会打印111111...次数为times次;
下面举例说明一下函数外的:
//H.h
#ifndef _H_H_
#define _H_H_
static int a = 0;
#endif
//Ex_2.c
#include "H.h"
void fun_ex2 ()
{
a++;
printf ("%d", a);//这时会打印1
}
//Ex_3
#include "H.h"
void fun_ex3 ()
{
printf ("%d", a);//这时打印的依然是0,即便先被Ex_2中的fun_ex2()函数修改过,因为他们
//是两个独立的副本
}
//Ex_1.c
void fun_1 ()
{
static int a = 0;
a ++;
printf ("%d", a);
}
void fun_2 (int times)
{
int i = 0;
for (;i < times; i++)
{
fun_1 ();
}
}
之后再执行fun_2的话,就会依次打印:12345....直到times;
如果去掉static关键字,执行fun_2,屏幕就会打印111111...次数为times次;
下面举例说明一下函数外的:
//H.h
#ifndef _H_H_
#define _H_H_
static int a = 0;
#endif
//Ex_2.c
#include "H.h"
void fun_ex2 ()
{
a++;
printf ("%d", a);//这时会打印1
}
//Ex_3
#include "H.h"
void fun_ex3 ()
{
printf ("%d", a);//这时打印的依然是0,即便先被Ex_2中的fun_ex2()函数修改过,因为他们
//是两个独立的副本
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |