3428|4

2776

帖子

413

TA的资源

五彩晶圆(中级)

楼主
 

面试笔试积累- static [复制链接]

中兴通讯2012校招笔试题的一道问答题:
1. static全局变量与普通的全局变量有什么区别 ?
 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
  全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。
  这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
static全局变量只初使化一次,防止在其他文件单元中被引用;  
2.  static局部变量和普通局部变量有什么区别 ?
  把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。  
  static局部变量只被初始化一次,下一次依据上一次结果值;  
3.  static函数与普通函数有什么区别?
   static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件.
  static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
此帖出自编程基础论坛

最新回复

额,那啥,说错了,不是有 新意 是 有心意 因为这些内容其实老掉牙了~~  详情 回复 发表于 2013-9-27 18:05

赞赏

1

查看全部赞赏

点赞 关注
个人签名
 

回复
举报

6041

帖子

199

TA的资源

版主

沙发
 
最后一句话 有些问题,没听说过拷贝之说。
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

板凳
 

回复 楼主qinkaiabc 的帖子

我也来说几句

关于第一点,除了最后一句,我都同意
static全局变量只初使化一次,防止在其他文件单元中被引用;

我不知道你说的是C 还是C++
说实话,C++里 引用 的概念我还不是很熟悉;
至于C,是没有 引用这个概念的。

实际上,说到 static 或者 全局变量 只初始化一次 这个说法有点奇怪。

因为我们常说初始化就是在定义的时候才有初始化的说法

这个 初始化 和 那个使用前的初始化当然不是一回事

那么,一次定义自然就只有一次初始化咯。

而这句话会让人误以为,难道还可以定义多次?

这当然是不行的,如果是局部变量,因为作用域的不同,你想在不同的的地方定义N个(同名)变量我都没意见。

而如果是全局或者 静态(源文件内部)

其实仍然是作用域的问题,归根到底就是 在同一个作用域里,因为不允许同名变量存在,所以永远只能定义一次,所以,根本不存在什么 只初始化一次的说法,因为从头到尾就只能定义一次,那必然也只能初始化一次。

当然,我不知道你这样说,实际上是什么意思,只是从我的理解,听起来怪怪的。

至于后半句,以防止在其他源文件被引用,这就更加说不通了
因为,static已经禁锢了它的作用域,是绝对不可能被引用的。

另外,说到 这个引用
要注意的是 这个引用 和 C++里说的那个reference 引用 这个术语 不是一回事

这个引用的意思其实说成 声明使用 更恰当。
因为这里的引用 经常是 通过在外部源文件 声明 这个 变量的名字——注意,是名字,不是变量本身
我的意思是

char Data  这里,Data是一个变量,是一个分配好内存的地址

extern char Data 这里,Data不是一个变量,它只是一个标示符,就是说一个 名字 而已。

当然了,如果你接下去取它的地址(......事实上我没干过这种事情,也不知道会不会出错,但感觉上应该是没问题)
那好吧,我还是试试

不过我想说,即使是可以,也不能等同认为它就是一个变量,一个内存地址。

嗯,我还是试试吧。
  1. // in sub.c
  2. char Data = 30;

  3. // in main.c
  4. #include
  5. #include

  6. extern char Data;

  7. void main(void)
  8. {
  9.      printf("the address of Data is %p",&Data);
  10. }
复制代码
编译是没有任何错误和警告的。
输出的结果看起来也正常


其实我在写这个简单的小程序的时候,我就已经想到为什么了。
因为任何变量和函数名,其实说到底是任何 标示符(也就是名字),他们在编译的时候,本身就是一个地址值
嗯,我的意思是,这个标示符本身就是一个地址
是故,我前面的说法 也有一半是错的。
那就是,尽管它的确只是声明 名字这个标示符,可是很遗憾,这个标示符本身也是一个地址
然而,这个地址和 定义变量时我们说 定义一个变量会得到一个地址 是两回事。
后者是 声明引用,前者是获得。


安全起见,我又重新添加了一个在sub.c里输入Data的地址的函数,验证,果然如此,地址还是一样的。(要不是这样,那恐怕天都要塌了~~)
  1. // in sub.c
  2. #include

  3. char Data = 30;

  4. void AddressInSub(void)
  5. {
  6.      printf("in sub module,the address is %p", &Data);
  7. }

  8. // in main.c
  9. #include
  10. #include

  11. extern char Data;

  12. void AddressInSub(void);

  13. void main(void)
  14. {
  15.      printf("the address of Data is %p",&Data);
  16.          printf("\n");
  17.          AddressInSub();
  18. }
复制代码
输出结果

QQ图片20130927175948.jpg (33.78 KB, 下载次数: 3)

[ 本帖最后由 辛昕 于 2013-9-27 18:01 编辑 ]
此帖出自编程基础论坛

赞赏

1

查看全部赞赏

 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

4
 

回复 沙发lcofjp 的帖子

这一部分我也听不懂

C语言里,我听说过 拷贝 的地方 是 在说 i++ 和 i+1
这个细节的地方

愿闻其详,不知道你说的拷贝是什么拷贝?

其实,static函数和static变量是类似的
说到底,都只是作用域的问题。
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

5
 

回复 楼主qinkaiabc 的帖子

额,那啥,说错了,不是有 新意

是 有心意

因为这些内容其实老掉牙了~~
此帖出自编程基础论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条
电源解决方案和技术 | DigiKey 应用探索站
当月好物、电源技术资源、特色活动、DigiKey在线实用工具,干货多多~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表