[应用相关] 关键字 static 的作用是什么?

[复制链接]
2476|60
 楼主| jlyuan 发表于 2020-7-25 20:05 | 显示全部楼层
如何引用一个已经定义过的全局变量?
dengdc 发表于 2020-7-25 20:07 | 显示全部楼层
可以用引用头文件的方式,也可以用 extern 关键字
pengf 发表于 2020-7-25 20:10 | 显示全部楼层
如果用引用头文件方式来引用某个在头文件中声明的全局变量,假定你将那个变量写错了,那么在编译期间会报错
ousj 发表于 2020-7-25 20:17 | 显示全部楼层
如果你用 extern 方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。
 楼主| jlyuan 发表于 2020-7-25 20:21 | 显示全部楼层
语句 for( ;1 ;)有什么问题?它是什么意思?
liliang9554 发表于 2020-7-25 20:24 | 显示全部楼层
和 while(1)相同,无限循环
 楼主| jlyuan 发表于 2020-7-25 20:27 | 显示全部楼层
程序的内存分配?
zhaoxqi 发表于 2020-7-25 20:34 | 显示全部楼层

一个由 c/C++编译的程序占用的内存分为以下几个部分:
a.栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据
结构中的栈
b.堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由 OS回收。注意它与数据结
构中的堆是两回事,分配方式倒是类似于链表,呵呵
c.全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量
在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放.
d.文字常量区—常量字符串就是放在这里的。程序结束后由系统释放
e.程序代码区—存放函数体的二进制代码
例子程序
这是一个前辈写的,非常详细
//main.cpp
int a=0;   //全局初始化区
char *p1;   //全局未初始化区
main()
{
intb;栈
char s[]="abc";   //栈
char*p2;        //栈
char *p3="123456";   //123456\0在常量区,p3 在栈上。
static int c=0;  //全局(静态)初始化区
p1 = (char*)malloc(10);
p2 = (char*)malloc(20);   //分配得来得10 和 20 字节的区域就在堆区。
strcpy(p1,"123456");   //123456\0放在常量区,编译器可能会将它与 p3 所向"123456"优化成一
个地方。
}
huwr 发表于 2020-7-25 20:36 | 显示全部楼层

栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。
堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由 OS回收。
yinxiangh 发表于 2020-7-25 20:39 | 显示全部楼层
  c语言代码是以文件为单位来组织的,在一个源程序的所有源文件中,一个外部变量(注意不是局部变量)或者函数只能在一个源程序中定义一次,如果有重复定义的话编译器就会报错。伴随着不同源文件变量和函数之间的相互引用以及相互独立的关系,产生了extern和static关键字。
xxmmi 发表于 2020-7-25 20:43 | 显示全部楼层
static局部变量

      普通的局部变量在栈空间上分配,这个局部变量所在的函数被多次调用时,每次调用这个局部变量在栈上的位置都不一定相同。局部变量也可以在堆上动态分配,但是记得使用完这个堆空间后要释放之。

       static局部变量中文名叫静态局部变量。它与普通的局部变量比起来有如下几个区别:

           1)位置:静态局部变量被编译器放在全局存储区.data(注意:不在.bss段内,原因见3)),所以它虽然是局部的,但是在程序的整个生命周期中存在。

           2)访问权限:静态局部变量只能被其作用域内的变量或函数访问。也就是说虽然它会在程序的整个生命周期中存在,由于它是static的,它不能被其他的函数和源文件访问。

           3)值:静态局部变量如果没有被用户初始化,则会被编译器自动赋值为0,以后每次调用静态局部变量的时候都用上次调用后的值。这个比较好理解,每次函数调用静态局部变量的时候都修改它然后离开,下次读的时候从全局存储区读出的静态局部变量就是上次修改后的值。
kangzj 发表于 2020-7-25 20:47 | 显示全部楼层
static函数
              相信大家还记得C++面向对象编程中的private函数,私有函数只有该类的成员变量或成员函数可以访问。在C语言中,也有“private函数”,它就是接下来要说的static函数,完成面向对象编程中private函数的功能。

            当你的程序中有很多个源文件的时候,你肯定会让某个源文件只提供一些外界需要的接口,其他的函数可能是为了实现这些接口而编写,这些其他的函数你可能并不希望被外界(非本源文件)所看到,这时候就可以用static修饰这些“其他的函数”。

           所以static函数的作用域是本源文件,把它想象为面向对象中的private函数就可以了。
gongche 发表于 2020-7-25 20:58 | 显示全部楼层
   static函数可以很好地解决不同原文件中函数同名的问题,因为一个源文件对于其他源文件中的static函数是不可见的。
huwr 发表于 2020-7-25 21:00 | 显示全部楼层
局部变量可以与全局变量同名
huanghuac 发表于 2020-7-25 21:03 | 显示全部楼层
你可以定义几个操作下,或者看C Primer Plus
morrisk 发表于 2020-7-25 21:11 | 显示全部楼层
静态的  范围不同
guoyt 发表于 2020-7-25 21:14 | 显示全部楼层
1时效
2.范围
langgq 发表于 2020-7-25 21:19 | 显示全部楼层
二楼说的比较全面了
huwr 发表于 2020-7-25 21:22 | 显示全部楼层
不存在指向空值的引用,但是存在指向空值的指针
 楼主| jlyuan 发表于 2020-7-25 21:26 | 显示全部楼层

明白了,多谢大家讨论这么多哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部