static函数与普通函数有什么区别
static是静态函数,可以是全局函数,而普通函数是局部函数。
全局函数可以在其它模块中引用调用。作用域比普通函数大。
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误.
1.静态函数有两种,类中的成员函数和你说的这种,就是全局的,静态的全局函数表示只能被当前“.cpp”文件所使用,当外部用extern关键字声明之后也是无法使用的,如果不是静态函数,外部只要用extren声明一次就可以调用这个函数了;
2.静态变量要分为3种,a.类中的成员;b.函数中的静态变量;c.静态全局变量;
静态全局变量和静态全局函数一样,只能被包含的“.cpp”文件调用,外部无法用extern声明并使用;类中的成员其实可以当作一个全局变量,不过它的特点是只能用在该类里面,它并不属于任何一个成员,而是属于整个类;
static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝.
在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。
1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)
2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。
c语言中static的语义
1.static变量:
1).局部
a.静态局部变量在函数内定义,生存期为整个源程序,但作用域与自动变量相同,只能在定义该变量的函数内使用。退出该函数后, 尽管该变量还继续存在,但不能使用它。
b.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。
2).全局全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。但是他们的作用域,非静态全局 变量的作用域是整个源程序(多个源文件可以共同使用); 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。
2.static函数(也叫内部函数)
只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。区别于一般的非静态函数(外部函数) static在c里面可以用来修饰变量,也可以用来修饰函数。 先看用来修饰变量的时候。变量在c里面可分为存在全局数据区、栈和堆里。其实我们平时所说的堆栈是栈而不包含对,不要弄混。
C语言这两道题加了static跟没加的有啥区别?
class Ca
{
public static int a=0;
public int b=0;
}
你在其他的类中,不能用Ca.b来访问,但是可以用Ca.a来访问a的值,而且这个a是所有的Ca类(包括其实例)公用的
Ca c=new Ca();
可以用c.b来访问b,如果你修改b,其实是修改了c.b,
Ca.a是程序一创建就存在的,知道程序关闭
c语言中static关键字有两个作用,一是文件作用域,二是函数作用域。
一、文件作用域
文件作用域关键字static的作用是,以static申明的全局变量、函数不得被其他文件所引用,例如:
//这是mystr.c文件的内容
#include
static int num = 10;
int mynum = 100;
static int str_len(char *str)
{
return strlen(str);
}
int mystr_len(char *str)
{
return str_len(str) + num;
}
当你mystr.c文件中的str_len函数加上了static关键字,你便不能在其他的地方复用这个函数,譬如,你不能这样写:
//这是main.c 的内容
#include
int main()
{
int len;
len = str_len("hello, world\n");
printf("%d %d\n", num, len )
return 0;
}
gcc main.c mystr_len.c
将不能编译通过,因为mystr.c中的num变量和str_len函数都用了static关键字,导致他们只能在mystr.c中被使用,如文件中的mystr_len函数可以引用num变量和str_len函数。
//这是main.c 的内容
#include
int main()
{
int len;
len = mystr_len("hello, world\n");
printf("%d %d\n", my_num, len )
return 0;
}
当不用static关键字时,等同于extern,即
int mystr_len(char *str)
{
return str_len(str) + num;
}
和
extern int mystr_len(char *str)
{
return str_len(str) + num;
}
是一样的。
二、函数作用域
static另外一个用途是函数内部静态变量,最常用的情况是
int *test()
{
int num = 100;
int *ptr = #
return ptr;
}
int main()
{
printf("%d\n", *test);
return 0;
}
该函数返回整数num的指针,在main函数中打印*test将会出现段错误,因为num做为test函数内部,只能在test内部被访问。以下程序是正确的。
int *test()
{
static int num = 100;
int *ptr = #
return ptr;
}
int main()
{
printf("%d\n", *test);
return 0;
}
该程序中num变量加了关键字static,函数运行结束后,依然可以在其他地方被引用,只是不能直接通过变量名访问,而要间接通过指针访问,原因是 static变量存储在全局数据段中而不是函数栈中。读者可以将它看作特殊的全局变量,只是其他地方只能通过指针来访问,而不能直接通过变量名访问。
鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com
图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!