`
wangstar
  • 浏览: 44017 次
  • 性别: Icon_minigender_1
  • 来自: 南昌
社区版块
存档分类
最新评论

作用域 全局变量 局部变量 静态变量 外部变量 常量 volatile变量

 
阅读更多

作用域 全局变量 局部变量 静态变量 外部变量 常量 volatile变量

作用域:

作用域规则告诉我们一个变量的有效范围,它在哪儿创建,在哪儿销毁(也就是说超出了作用域)。变量的有效作用域从它的定义点开始,到和定义变量之前最邻近的开括号配对的第一个闭括号。也就是说,作用域由变量所在的最近一对括号确定。

全局变量:

全局变量是在所有函数体的外部定义的,程序的所在部分(甚至其它文件中的代码)都可以使用。全局变量不受作用域的影响,问题可以使用的(也就是说,全局变量的生命期一直到程序的结束)。如果在一个文件中使用extern关键字来声明另一个文件中存在的全局变量,那么这个文件可以使用这个数据。

局部变量:

局部变量出现在一个作用域内,它们是局限于一个函数的。局部变量经常被称为自动变量,因为它们在进入作用域时自动生成,离开作用域时自动消失。关键字auto可以显式地说明这个问题,但是局部变量默认为

auto,所以没有必要声明为auto。

寄存器变量

寄存器变量是一种局部变量。关键字register告诉编译器“尽可能快地访问这个变量”。加快访问速度取决于现实,但是,正如名字所暗示的那样,这经常是通过在寄存器中放置变量来做到的。这并不能保证将变置在寄存器中,甚至也不能保证提高访问速度。这只是对编译器的一个暗示。

使用register变量是有限制的。不可能得到或计算register 变量的地址。register变量只能在一个块中声明(不可能有全局的或静态的register变量)。然而可以在一个函数中(即在参数表中)使用register变量作为一个形式参数。

一般地,不应当推测编译器的优化器,因为它可能比我们做得更好。因此,最好避免使用关键字register。

静态变量

关键字static有一些独特的意义。通常,函数中定义局部变量在函数中作用域结束时消失。当再次调用这个函数时,会重新创建变量的存储空间,其值会被重新初始化。如果想使局部变量的值在程序的整个生命期里仍然存在,我们可以定义函数的局部变量为static(静态的),并给它一个初始化。初始化只在函数第一次调用时执行,函数调用之间变量的值保持不变,这种方式,函数可以“记住”函数调用之间的一些信息片断。

我们可能奇怪为什么不使用全局变量。static变量的优点是在函数范围之外它是不可用的,所以它不可能被轻易改变。这会使错误局部化。

static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

外部变量

extern告诉编译器存在着一个变量和函数,即使编译器在当前的文件中没有看到它。这个变量或函数可能在一个文件或者在当前文件的后面定义。例如extern int i;编译器会知道i肯定作为全局变量存在于某处。当编译器看到变量i的定义时,并没有看到别的声明,所以知道它在文件的前面已经找到了同样声明的i 。

常量

const告诉编译器这个名字表示常量,不管是内部的还是用户定义的数据类型都可以定义为const。如果定义了某对象为常量,然后试图改变它,编译器将会产生错误。在C++中一个const必须有初始值。

volatile变量

限定词const告诉编译器“这是不会改变的”(这就是允许编译器执行额外的优化);而限定词volatile则告诉编译器“不知道何时变化”,防止编译器依据变量的稳定性作任何优化。

0
0
分享到:
评论

相关推荐

    C++ 作用域规则

    C++ 作用域规则 C++ 中的作用域规则是指变量的有效范围,它们在哪里创建,在哪里销毁。...从分配内存空间看,全局变量、静态局部变量、静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间。

    static,const,volatile用法

    `static` 可以分为两种类型:全局作用域内的静态变量和局部作用域内的静态变量。 - **全局作用域内的静态变量**: - 如果在一个源文件内定义了一个静态变量,则该变量只在这个源文件内部可见,即只能被该源文件中...

    C/C++中作用域详解

    在C/C++编程语言中,作用域是定义变量在代码中的可见性和生命周期的关键概念。...在实际编程中,应遵循最佳实践,如尽量避免全局变量的使用,合理利用局部变量和静态变量,以及正确处理常量和可能变化的变量。

    iOS面试宝典

    ”此题考察的是局部变量和全局变量的作用域以及它们之间的关系。答案是肯定的,局部变量可以和全局变量重名。当在一个函数内部定义了一个与全局变量同名的局部变量时,局部变量会“隐藏”掉全局变量,即在该函数内部...

    const extern static volatile 小结

    对于全局变量,则限制了其作用域仅限于定义它的文件。 1. **局部变量**: - 使用 `static` 修饰的局部变量在函数退出后仍然保留其值,下次调用函数时,变量仍保留上一次的值。 - 局部 `static` 变量的作用域仅...

    const,extern,static,volatile的使用

    - **局部变量**:如果在一个函数中定义了一个局部变量并加上 `static`,那么这个变量在整个程序运行期间都存在,并且其初始值只会被初始化一次。 **2. static 函数** - **限制作用域**:在一个文件中定义了带有 `...

    面试题目.docx

    11. **局部变量和全局变量重名**:在同一作用域内,局部变量可以与全局变量同名,但在局部作用域中,局部变量会覆盖全局变量。 12. **extern 关键字**:用于声明全局变量,让其他文件能够访问。 13. **内存问题**...

    面试题题库,经典知识点

    13. 局部变量能否和全局变量重名:可以重名,但它们的作用域不同,在函数内部的局部变量会遮蔽同名的全局变量。 14. 引用一个已经定义过的全局变量:在其他文件中通过extern关键字来引用已定义的全局变量。 15. ...

    嵌入式C面试题总结整理

    尽管都存储在静态数据区,但是全局变量的作用域是整个程序,而静态全局变量的作用域仅限于声明它的模块。 6. 数组与链表的区别 数组是一块连续的内存区域,用于存储固定大小的数据,且必须是同类型元素。数组访问...

    C语言中auto,register,static,const,volatile的区别

    - `static`用于定义静态局部变量和控制全局变量及函数的作用域。 - `const`用于保护数据不被修改,提高代码安全性和可维护性。 - `volatile`用于处理可能被外部实体修改的变量,确保其值的准确性。 通过理解这些...

    c++基础总结

    **作用域限制**:在模块(或称为翻译单元)内部,静态变量只对当前模块内的函数可见,对外部不可见,增强了数据隐藏性。 3. **内部函数的声明与定义**:内部函数(static修饰的函数)只能在当前源文件中使用,不应...

    C语言中auto,register,static,const,volatile的区别.docx

    - **全局变量**:当应用于全局变量时,`static`限制了变量的作用域,使其只在定义它的源文件内可见,无法通过其他文件的`extern`声明来访问。这样可以降低模块间的耦合度,增加代码的封装性。 4. **`const`**: `...

    C语言中auto register static const volatile 区别

    3. 当static用来修饰全局变量时,它就改变了全局变量的作用域,使其不能被别的程序extern,限制在了当前文件里,但是没有改变其存放位置,还是在全局静态储存区。 使用注意: 1. 若全局变量仅在单个C文件中访问,...

    C存储类型和类型限定符

    C语言的存储类型和类型限定符是编程时非常重要的概念,它们影响着变量的生命周期、作用域和存储位置。下面是对这些概念的详细说明: **存储类型** 1. **自动存储类(Automatic)**:这类对象在程序块(如函数内部)...

    c语言深度挖掘(一)

    常量和变量的区分在于是否可以修改,而变量的可见性则关乎其作用域,即在哪些代码块内可以访问到。 在破解密码验证程序等安全问题上,理解内存管理和变量生命周期有助于分析程序行为,找出潜在漏洞。 总结来说,...

    经典c语言面试题

    在C语言中,局部变量和全局变量可以同名,但局部变量在其作用域内会遮蔽同名的全局变量。这意味着在局部变量的作用域内,对变量的操作实际上是在操作局部变量,而不会影响到全局变量。 2. **如何引用一个已经定义...

    在嵌入式软件编程中深入理解关键字

    `,限制全局变量的作用域为当前文件,避免命名冲突。 - 函数:`static void foo() {}`,声明的函数只在定义它的文件中可见,提供模块化编程的能力。 3. extern extern关键字用于声明外部变量或函数,表明它们在其他...

    C语言面试题大全.pdf

    3. 全局变量和局部变量的内存区别:全局变量存储在静态存储区,局部变量存储在栈区,生命周期和作用域不同。 4. 平衡二叉树:一种自平衡的二叉搜索树,如AVL树或红黑树,保持左右子树高度平衡,查找效率高。 5. 堆栈...

Global site tag (gtag.js) - Google Analytics