美文网首页
7.C(变量类型和作用域)

7.C(变量类型和作用域)

作者: 任振铭 | 来源:发表于2018-05-18 07:33 被阅读12次
1.普通局部变量

1)在{}内部定义的变量就是局部变量
2)只有执行到定义变量的这个语句,系统才会给这个变量分配空间
3)当离开{},这个非static局部变量自动释放
4)局部变量的作用域在当前的{}。离开后无法使用
5){}中的局部变量,加不加auto关键字都一样,局部变量也叫自动变量
6)不同的{}中,变量名字可以一样
7)普通局部变量不初始化,它的值为随机数

2.static局部变量

1)在{}内部定义的变量就是局部变量
2)static局部变量,在编译阶段就已经分配空间,函数没有调用前,它已经存在
3)当离开{},static局部变量不会释放,只有程序结束,才会释放
4)局部变量的作用域在当前的{}。离开后无法使用
5){}中的局部变量,加不加auto关键字都一样,局部变量也叫自动变量
6)不同的{}中,变量名字可以一样
7)static局部变量不初始化,值默认为0
8)static局部变量初始化语句,只会执行一次,但是可以赋值多次
9)static变量只能用常量赋值

#include <stdio.h>
void fun() {
    static int i = 0;
    i++;
    printf("i = %d\n", i);
    //static int j = i; err  static变量只能用常量赋值
}
int main() {
    fun();
    fun();
    fun();
    system("pause");
}
3.普通局部变量和static局部变量的区别
内存分配和释放

1)普通局部变量只有执行到定义的语句才分配空间;static变量在编译阶段已经分配
2)普通局部变量离开作用域自动释放;static局部变量在整个程序结束释放

初始化

1)普通局部变量如果不初始化,值为随机数;static局部变量如果不初始化,值为0(int)
2)static 局部变量初始化语句只有第一次执行时有效
3)static局部变量只能用常量初始化

3.普通全局变量

1)在{}外面,也就是函数外面定义的变量为全局变量
2)只要定义了全局变量,任何地方都能使用此变量
3)如果使用变量时,在前面找不到此全局变量的定义,需要先声明后再使用
4)全局变量不初始化,默认值为0
5)在一个文件或多个文件中,普通全局变量只能定义一次(否则会报重复定义的错误),可以声明多次
7)全局变量在编译阶段已经分配空间,在整个程序执行完毕释放

#include <stdio.h>
void fun() {
    //这样是错误的,虽然a是全局变量,但却在fun方法的后边定义,编译器编
    //译代码是从上往下的,所以在编译fun方法的时候,没有找到a的定义,这时候
    //需要声明一下才行
    //printf("a = %d\n",a);

     extern int a; //注意声明的时候不要赋值
     printf("a = %d\n",a);
}
int a = 10;
int main() {
    fun();
    system("pause");
}
4.在多个文件中使用普通全局变量

假设我创建了一个a.c的文件,在这个文件中定义了一些变量和方法,这些变量和方法会在多个类中使用,如下 a.c

int a = 0;
int b = 0;
void test() {
    a = 10;
    b = 20;
}

假设我在1.c和2.c文件中都要调用test方法并且为ab赋值,那么需要这样做,使用之前要添加变量和方法的声明
a.c

#include <stdio.h>
extern void test();
extern int a;
int main() {
    test();
    a = 100;
    system("pause");
}

2.c

#include <stdio.h>
extern void test();
extern int a;
int haha() {
    a = 1009;
    system("pause");
}

那么这样一来是非常繁琐的,假设a.c中有一百个方法一百个变量,另外有一百个文件都要用到a.c中的一百个方法和一百个变量,那么就要重复的在这一百个文件中声明这一百个变量和方法了,也就是同一个声明做了一百次,这样是毫无意义的,所以才有了头文件,a中的所有变量和方法都可以声明在一个头文件中,这样那一百个需要使用a中成员的文件只需要引入这个头文件即可,大大简化了无效代码,所以上边的三个文件可以这样写

注意:不要在头文件中给变量赋值,(赋值之后相当于声明并定义了一个变量),此时如果在多个文件中引入这个头文件,相当于在多个文件中都定义了这个变量,而我们知道在一个文件或多个文件中,普通全局变量只能定义一次(否则会报重复定义的错误)

//a.c
int a = 0;
int b = 0;
void test() {
    a = 10;
    b = 20;
}

//a.h
#pragma once  //防止重复引入
extern int a;
extern int b;
extern void test();

//1.c
#include <stdio.h>
//引入头文件
#include "a.h"
int main() {
    test();
    a = 100;
    system("pause");
}

//2.c
#include <stdio.h>
//引入头文件
#include "a.h"
int haha() {
    a = 1009;
    system("pause");
}
5.static全局变量

1)static全局变量和普通全局变量的区别就是文件作用域不同,static全局变量只能在定义它的文件中使用,而普通全局变量在所有文件中都能使用,只需要声明即可,这一点和Java全然不同
2)static全局变量不能通过extern关键字引入到别的文件中,extern关键字只用于普通全局变量
3)不同文件只能出现一个普通全局变量定义
4)一个文件只能有一个static全局变量的定义,不同文件间的static全局变量即使变量名相同,也是两个没有关系的变量
5)不能在两个文件中定义两个变量名相同的普通全局变量,会报重复定义的错误,因为在一个文件中定义之后,在另一个文件就可以使用了,所以没必要也不允许那样定义

//这样在两个文件中都定义了a,运行就会报错
//1.c

#include <stdio.h>
int a = 100;
//在1.c中定义一个static变量b
static int b = 10;

//一个文件只能有一个static全局变量的定义
//这样再次定义b,会提示重定义
//static int b = 29;
int main() {
    system("pause");
}
//2.c
#include <stdio.h>

//这样在两个文件中都定义了a,运行就会报错
//int a = 200;

int haha() {
    //通过extern引入1.c中的static变量b,这是错误的,
    //不能这样使用,b只能在1.c中使用
    //extern int b;
    //b = 20;
    system("pause");
}
6.普通函数和static函数的区别

函数和变量的使用原则是一样的,都是作用域上的区别

1)在一个文件中定义了一个函数之后,所有文件都可以使用这个函数(前提是声明之后),不能在另一个文件中定义相同的函数
2)一个文件可以有一个static函数,并且另一个文件可以有完全相同的一个函数的定义,但是这个static函数只能在当前文件使用

7.变量作用域总结
图片.png

相关文章

  • 7.C(变量类型和作用域)

    1.普通局部变量 1)在{}内部定义的变量就是局部变量2)只有执行到定义变量的这个语句,系统才会给这个变量分配空间...

  • JS回顾变量、作用域、内存问题

    基本类型和引用类型的值属性的动态复制变量值传递参数检测类型 执行环境与作用域延长作用域链没有块级作用域声明变量提升...

  • 从零开始复习Java-变量、常量、作用域

    变量(Variable) Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。 变量作用域 ...

  • ECMA知识点

    变量、作用域和内存问题 变量基本类型值和引用类型值 执行环境和作用域当代码在一个环境中执行时,会创建变量对象的一个...

  • 第八章 变量、作用域、内存

    变量及作用域 ​ JavaScript的变量是松散型(一个变量可以改变类型)。 基本类型和引用类型的值ECMA...

  • Java程序基础面试题(一)

    常量与变量 变量变量包括变量名,变量类型和作用域几个部分,格式如下: 类型 标识符 = 初始值;ex: int ...

  • C语言函数定义域

    作用域:起作用的区域变量按作用域分:局部变量:定义在函数内部的变量全局变量 :定义在函数外部的变量变量按存储类型分...

  • node.js小记 (0419) http源码解读

    什么是作用域? 作用域分局部作用域和全局作用域,同时作用域和变量有关,在局部作用域内可以访问到全局变量,在局部作用...

  • JS之变量、作用域和内存

    变量及作用域 1、基本类型和引用类型的值ECMAScript 变量:基本类型值和引用类型值。将一个值赋给变量时,解...

  • JavaScript面试考点之作用域和作用域链、执行上下文和执行

    1、作用域和作用域链 1)作用域 作用域是变量(变量作用域又称上下文)和函数生效(能被访问)的区域。作用域决定了代...

网友评论

      本文标题:7.C(变量类型和作用域)

      本文链接:https://www.haomeiwen.com/subject/xkswdftx.html