static变量三个作用

合集下载

c语言关键字的用法详解

c语言关键字的用法详解

1. Static用法1.1 static声明的变量在C语言中有两方面的特征:1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。

这一点是它与堆栈变量和堆变量的区别。

2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。

这一点是它与全局变量的区别。

1.2 特点A。

若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;B。

若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;D。

如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static 的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

函数前加static使得函数成为静态函数。

但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数).使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。

扩展分析:术语static有着不寻常的历史.起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量.随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数.为了避免引入新的关键字,所以仍使用static关键字来表示这第二种含义.最后,C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数(与Java中此关键字的含义相同).1.3 关键字static的作用是什么?这个简单的问题很少有人能回答完全。

在C语言中,关键字static有三个明显的作用:1.3.1 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

C++中static的作用

C++中static的作用

C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。

前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。

一、面向过程设计中的static1、静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。

我们先举一个静态全局变量的例子,如下://Example 1#include <iostream.h>void fn();static int n; //定义静态全局变量void main(){ n=20;cout<<n<<endl;fn();}void fn(){ n++;cout<<n<<endl;}静态全局变量有以下特点:该变量在全局数据区分配内存;未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化);静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量。

对于一个完整的程序,在内存中的分布情况如下图:代码区全局数据区堆区栈区一般程序的由new产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。

自动变量一般会随着函数的退出而释放空间,静态数据(即使是函数内部的静态局部变量)也存放在全局数据区。

全局数据区的数据并不会因为函数的退出而释放空间。

细心的读者可能会发现,Example 1中的代码中将static int n; //定义静态全局变量改为int n; //定义全局变量程序照样正常运行。

的确,定义全局变量就可以实现变量在文件中的共享,但定义静态全局变量还有以下好处:静态全局变量不能被其它文件所用;其它文件中可以定义相同名字的变量,不会发生冲突;您可以将上述示例代码改为如下://Example 2//File1#include <iostream.h>void fn();static int n; //定义静态全局变量void main(){ n=20;cout<<n<<endl;fn();}//File2#include <iostream.h>extern int n;void fn(){ n++;cout<<n<<endl;}编译并运行Example 2,您就会发现上述代码可以分别通过编译,但运行时出现错误。

c++的static关键字用法

c++的static关键字用法

c++的static关键字用法C++中的`static`关键字有多种用法,在不同的场景下都有着不同的含义和作用。

本文将详细介绍C++中`static`关键字的用法及其相关特性,希望能对读者更好地理解和运用这个关键字。

一、`static`关键字概述`static`是C++中的一个关键字,它常用于指定函数、变量、类成员等的作用域和生命周期。

它的主要作用如下:1. 限定变量的作用域。

使用`static`关键字声明的变量具有静态的生存期和块作用域,即在整个程序运行期间都存在,并且只能在声明变量的源文件中访问。

2. 限定函数的作用域。

使用`static`关键字声明的函数具有静态的作用域,即只能在声明它的源文件中调用。

3. 限定类成员的作用域。

使用`static`关键字声明的类成员为静态成员,它不属于类的任何一个对象,而是属于整个类,可以通过类名或类对象来访问。

4. 防止符号重定义。

当在多个源文件中定义同名的全局变量或函数时,使用`static`关键字可以防止它们之间的符号重定义错误。

二、静态变量1. 全局静态变量使用`static`关键字声明的全局变量具有静态生存期和文件作用域,即它在程序运行期间一直存在,而且只能在声明它的源文件中访问。

例如:```cpp//file1.cpp#include <iostream>static int count = 10; //声明全局静态变量countvoid func() {static int i = 5; //局部静态变量i,生命周期为整个程序运行期间std::cout << "i is " << i ;std::cout << " and count is " << count << std::endl;i++;count++;}```在另一个源文件中引用这个全局静态变量,编译器会报错:```cpp//file2.cpp#include <iostream>extern int count; //声明全局变量countvoid func2() {std::cout << "count is " << count << std::endl;}```编译器会报错:undefined reference to `count'。

static int在c语言中的用法

static int在c语言中的用法

static int在c语言中的用法一、概述在C语言中,static关键字是一个非常有用的修饰符,它可以用于声明不同类型的数据和函数,包括静态局部变量、静态全局变量、静态函数以及静态类成员等。

其中,static int用于声明一个静态整型变量,它的用法和普通变量略有不同,具有一些独特的性质和用途。

二、静态局部变量静态局部变量是指在函数内部声明的static变量。

这些变量在函数被调用时才会分配内存,函数调用结束时,静态局部变量将一直保留其值,直到下一次调用该函数时才会被销毁。

静态局部变量的作用范围仅限于函数内部,无法在外部访问。

例如:```cvoid function() {static int var = 0;// ...}```在上述代码中,var是一个静态局部变量,每次调用function()时,它的值都会被重置为0。

这对于计数、记录状态等用途非常有用。

三、静态全局变量static还可以用于声明全局变量。

静态全局变量只在程序编译时分配内存,并且在程序运行过程中一直存在,不会因为函数调用而销毁。

静态全局变量的作用范围是整个程序,可以在其他文件和函数中访问。

例如:```cstatic int globalVar = 0; // 静态全局变量```上述代码中,globalVar是一个静态全局变量,它只会在程序编译时分配一次内存,并且在程序运行过程中一直存在。

这对于需要在多个函数之间共享数据的情况非常有用。

四、静态函数static还可以用于声明函数。

静态函数是一种特殊类型的函数,它在程序编译时就已经存在,并且不会因为函数的调用而重新分配内存。

这意味着静态函数的作用范围仅限于当前文件,无法在其他文件中直接调用。

通常用于实现只在该文件中使用的功能。

例如:```cstatic void function() {// ...}```上述代码中,function()是一个静态函数,它只能在当前文件中使用,不能在其他文件中直接调用。

嵌入式面试最常用的307个试题和答案(一)

嵌入式面试最常用的307个试题和答案(一)

嵌入式面试最常用的307个试题和答案(一)经典嵌入式面试题总结C语言测试是招聘嵌入式系统程序员过程中必须而且有效的方法。

这些年,我既参加也组织了许多这种测试,在这过程中我意识到这些测试能为带面试者和被面试者提供许多有用信息,此外,撇开面试的压力不谈,这种测试也是相当有趣的。

从被面试者的角度来讲,你能了解许多关于出题者或监考者的情况。

这个测试只是出题者为显示其对ANSI标准细节的知识而不是技术技巧而设计吗?这个愚蠢的问题吗?如要你答出某个字符的ASCII值。

这些问题着重考察你的系统调用和内存分配策略方面的能力吗?这标志着出题者也许花时间在微机上而不上在嵌入式系统上。

如果上述任何问题的答案是"是"的话,那么我知道我得认真考虑我是否应该去做这份工作。

从面试者的角度来讲,一个测试也许能从多方面揭示应试者的素质:最基本的,你能了解应试者C语言的水平。

不管怎么样,看一下这人如何回答他不会的问题也是满有趣。

应试者是以好的直觉做出明智的选择,还是只是瞎蒙呢?当应试者在某个问题上卡住时是找借口呢,还是表现出对问题的真正的好奇心,把这看成学习的机会呢?我发现这些信息与他们的测试成绩一样有用。

有了这些想法,我决定出一些真正针对嵌入式系统的考题,希望这些令人头痛的考题能给正在找工作的人一点帮住。

这些问题都是我这些年实际碰到的。

其中有些题很难,但它们应该都能给你一点启迪。

这个测试适于不同水平的应试者,大多数初级水平的应试者的成绩会很差,经验丰富的程序员应该有很好的成绩。

为了让你能自己决定某些问题的偏好,每个问题没有分配分数,如果选择这些考题为你所用,请自行按你的意思分配分数。

预处理器(Preprocessor)1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL我在这想看到几件事情:; #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等); 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。

c中static的作用和用法

c中static的作用和用法

一、static的基本概念二、static的作用1. 控制变量的作用域2. 保持变量的持久性3. 保护变量不被其他文件访问三、static的用法1. 在函数内部使用static修饰局部变量2. 在全局变量前使用static修饰3. 在函数前使用static修饰函数四、static与全局变量、局部变量以及extern的区别与通联五、static在不同编程语言中的应用情况六、总结一、static的基本概念在C语言中,static是一个重要的关键字,它可以用来修饰变量和函数,具有一定的特殊作用。

二、static的作用1. 控制变量的作用域当static修饰局部变量时,该变量的作用域仅限于声明它的函数内部,超出该函数范围后,该变量就无法被访问。

这种特性在一定程度上增强了函数的安全性和封装性,避免了变量被误用或意外修改的风险。

2. 保持变量的持久性一般情况下,局部变量的生命周期仅限于其所在的函数执行期间,函数执行完毕后,这些局部变量所占用的内存空间就会被回收。

但是,如果将局部变量使用static修饰后,它的生命周期将会被延长至整个程序的执行期间,即使函数执行完毕,该变量所占用的内存空间也不会被回收。

这种特性有利于在多次调用同一个函数时,保持上一次调用的状态信息。

3. 保护变量不被其他文件访问当static修饰全局变量时,该全局变量的作用范围会被限制在声明它的文件内部,其他文件无法直接访问该全局变量。

这为数据的封装和保护提供了可能。

三、static的用法1. 在函数内部使用static修饰局部变量```void function() {static int a = 0;// other statements}```2. 在全局变量前使用static修饰```static int b = 0;// other statements```3. 在函数前使用static修饰函数```static void function() {// function statements}```四、static与全局变量和局部变量以及extern的区别与通联1. static全局变量和普通全局变量的区别在于作用域不同。

c语言中static变量详解

c语言中static变量详解

c语⾔中static变量详解Static翻译出来是“静态”“静⽌”的意思,在C语⾔中的意思其实和它的本意差不多,表⽰“静态”或者“全局”的意思,⽤来修饰变量和函数。

经static修饰过后的变量或者函数的作⽤域或者存储域会发⽣变化,⽽由static修饰的变量在初始值⽅⾯也会表现出static关键字的优势。

想知道经static修饰过后的变量或者函数的作⽤域或者存储域发⽣了什么变化吗,发⽣变化的原因是什么吗?请⼤家继续往下看!⼀、c程序的内存分布既然static是⽤来修饰变量和函数的,⽽变量和函数⼜是组成c程序必不可少的,C程序的内存分布图如下。

C程序由下⾯5部分组成: 1)正⽂段——CPU执⾏的机器指令部分;⼀个程序只有⼀个副本;只读,防⽌程序由于意外事故⽽修改⾃⾝指令; 2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这⾥。

3)⾮初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。

4)栈——增长⽅向:⾃顶向下增长;⾃动变量以及每次函数调⽤时所需要保存的信息(返回地址;环境信息)。

5)堆——动态存储区。

是向⾼地址扩展的数据类型,是⾃下向上的扩展⽅式。

c程序内存分布图上⾯的C程序分布图很明显的告诉我们,变量是存储在栈区或者堆区或者bss段或者data段,变量的存储域为什么会有所不同呢?其实原因很简单,说⽩了就是与他们定义在程序的不同地⽅,有没有static关键字修饰有关啦,定义在不同的地⽅也说明了他们有着不同的作⽤域。

⼆、static修饰的变量1. 全局静态变量 在全局变量之前加上关键字static,全局变量就被定义成为⼀个全局静态变量。

1)内存中的位置:静态存储区(静态存储区在整个程序运⾏期间都存在) 2)初始化:未经初始化的全局静态变量会被程序⾃动初始化为0(⾃动对象的值是任意的,除⾮他被显⽰初始化) 3)作⽤域:全局静态变量在声明他的⽂件之外是不可见的。

C语言面试题及答案

C语言面试题及答案

1、关键字 static 的作用是什么?这个简单的问题很少有人能回答完全。

在 C 语言中,关键字static 有三个明显的作用: 1).在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

2).在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。

它是一个本地的全局变量。

3).在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。

那就是,这个函数被限制在声明它的模块的本地范围内使用。

大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。

这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。

2、.h 头文件中的 ifndef/define/endif 的作用?答:防止该头文件被重复引用。

3、描述实时系统的基本特性答:在特定时间内完成特定的任务,实时性与可靠性。

4、什么是平衡二叉树?答:左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1。

5、冒泡排序算法的时间复杂度是什么?答:O(n^2)6、队列和栈有什么区别?答:队列先进先出,栈后进先出7、局部变量能否和全局变量重名?答:能,局部会屏蔽全局。

要用全局变量,需要使用"::" 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。

对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内8、全局变量可不可以定义在可被多个.C 文件包含的头文件中?为什么?答、可以,在不同的C 文件中以static 形式来声明同名全局变量。

可以在不同的 C 文件中声明同名的全局变量,前提是其中只能有一个 C 文件中对此变量赋初值,此时连接不会出错。

9、do……while 和while……do 有什么区别?答前一个循环一遍再判断,后一个判断以后再循环。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

static的作用
在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。

(1)先来介绍它的第一条也是最重要的一条:隐藏。

当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。

为理解这句话,我举例来说明。

我们要同时编译两个源文件,一个是a.c,另一个是main.c。

下面是a.c的内容
char a = 'A'; // global variable
void msg()
{
printf("Hello\n");
}
下面是main.c的内容
int main(void)
{
extern char a; // extern variable must be declared before use
printf("%c ", a);
(void)msg();
return 0;
}
程序的运行结果是:
A Hello
你可能会问:为什么在a.c中定义的全局变量a和函数msg能在main.c中使用?前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。

此例中,a
是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的。

如果加了static,就会对其它源文件隐藏。

例如在a和msg的定义前加上static,main.c就看不到它们了。

利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。

Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。

(2)static的第二个作用是保持变量内容的持久。

存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。

共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。

虽然这种用法不常见,但我还是举一个例子。

#include <stdio.h>
int fun(void){
static int count = 10; // 事实上此赋值语句从来没有执行过
return count--;
}
int count = 1;
int main(void)
{
printf("global\t\tlocal static\n");
for(; count <= 10; ++count)
printf("%d\t\t%d\n", count, fun());
return 0;
}
程序的运行结果是:
global local static
1 10
2 9
3 8
4 7
5 6
6 5
7 4
8 3
9 2
10 1
(3)static的第三个作用是默认初始化为0。

其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。

在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。

比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。

如果定义成静态的,就省去了一开始置0的操作。

再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加’\0’太麻烦。

如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是’\0’。

不妨做个小实验验证一下。

#include <stdio.h>
int a;
int main(void)
{
int i;
static char str[10];
printf("integer: %d; string: (begin)%s(end)", a, str);
return 0;
}
程序的运行结果如下
integer: 0; string: (begin)(end)
最后对static的三条作用做一句话总结。

首先static的最主要功能是隐藏,其次因为static 变量存放在静态存储区,所以它具备持久性和默认值0。

相关文档
最新文档