C语言之变量类型和存储方式

变量可以分为全局变量、静态全局变量、局部变量和静态局部变量

变量的声明有两种情况:

1、一种是需要建立存储空间的(定义性声明)。例如int a 在生命的时候就已经建立了存储空间。

2、另一种是不需要建立存储空间的(引用性声明)。例如extern int a 其中变量a是在别的文件中定义的。

内存区域的划分:

1、栈区:由编译器自动分配和释放的内存区域,用于存放函数的参数值、局部变量等。

2、堆区:程序员向系统申请或释放。

3、全局区:用来保存全局变量和静态变量。

4、文字常量区:用来保存常量字符串的内存区域。

5、程序代码区:用来保存函数体的二进制代码。

先看一个例子:

fileOne.h头文件如下:

#ifndef DMTestVariable_fileOne_h
#define DMTestVariable_fileOne_h

// 声明全局变量
extern int globalVariable;

void addOne();
void testStaticGlobal();

#endif

fileOne.c文件如下:

#include <stdio.h>
#include "fileOne.h"

// 静态全局变量
static int staticGlobalVariable = 12;

void addOne()
{
    // 全局变量加1
    globalVariable += 1;
}

void testStaticGlobal()
{
    // 静态全局变量加1
    staticGlobalVariable += 1;
    printf("静态全局变量:%d\n",staticGlobalVariable);
}

main.c文件如下:

#include <stdio.h>
#include "fileOne.h"

// 定义性声明全局变量
int globalVariable = 10;
void test()
{
    // 静态局部变量
    static int staticLocalVariable = 20;
    staticLocalVariable += 1;
    printf("静态局部变量值:%d\n",staticLocalVariable);
}

int main(int argc, const char * argv[])
{
    // 局部变量测试
    int localVariable = 15;
    printf("局部变量%d\n",localVariable);
    
    // 全局变量测试
    addOne();
    printf("全局变量:%d\n",globalVariable);
    
    // 静态局部变量的测试
    for (int i = 0 ; i < 2; i++) {
        test();
    }
    
    // 静态全局变量
    for (int i = 0 ; i < 2; i++) {
        testStaticGlobal();
    }
    return 0;
}

输出结果如下:

总结如下:

全局变量,具有全局作用域,只需在一个源文件中定义,就可以作用于所有的源文件,当然其他不包含全局变量定义的源文件需要用extern关键字再次声明这个全局变量,如代码中的

// 定义性声明全局变量
int globalVariable = 10;

全局变量,定义在main.c源文件中,在fileOne.c源文件中使用时有以下代码再次声明

// 声明全局变量
extern int globalVariable;

静态全局变量,只能在其所在文件模块中的函数中使用,其他文件模块中的函数不能访问。如代码中的

// 静态全局变量
static int staticGlobalVariable = 12;

只能在fileOne.c源文件中使用,不能在main.c源文件中使用。

局部变量:只能在定义该变量的函数体内使用。如代码中的

// 局部变量测试
    int localVariable = 15;

只能在main函数中使用。

静态局部变量:在函数内定义,但当函数退出后,静态局部变量始终存在,其占用的内存单元不会被释放,直到程序结束时才被释放。退出函数后尽管该静态局部变量还存在,但是不能使用它,如果再次调用定义该静态局部变量的函数,它又可以继续使用,而且保存了上次调用之后留下的值。如代码中的

// 静态局部变量
    static int staticLocalVariable = 20;

第一次调用test()函数输出的此静态局部变量值为21,第二次调用函数test()输出的此静态局部变量值为22。

C语言之变量类型和存储方式,布布扣,bubuko.com

时间: 2024-08-25 12:18:03

C语言之变量类型和存储方式的相关文章

float和double类型的存储方式

Float double 类型在计算机的存储方式 计算机中只认识10的二进制数,那么该如何存储小数呢? 那么我们先看Floa类型: Float在计算机(32位)中是4个字节的,具体地:第一位为符号位0为正,1为负 第2到第9位为指数位,第10到32位为尾数位,具体地如下图所示: 1 2 9 10 32 现在我们举个例子: 8.25的二进制表示方法为:1000.01 =1.00001*23 ,指数为3,尾数为00001,那么它怎样在二进制中存储呢? 首先看符号位为正,所以第一位为0,指数为3,要加

C类型和存储方式的语言变量

变量的作用域:有效射程变量 >局部变量 1.在函数中的局部变量,量在该函数结束后自己主动撤销 2.函数内的复合语句中的局部变量(比方for语句),这个变量在复合语句结束后自己主动撤销.这个变量能够与1中的变量重名,在复合语句作用域中里面定义的变量权限更高,考虑到可读性不推荐这么做 比如: #include<stdio.h> #include<stdlib.h> void fun1(); int main() { fun1(); } void fun1() { int m=20

Android的资源类型和存储方式简介-android学习之旅(五十二)

android资源的类型 android资源的存储方式

如何判断c语言的变量类型

变量三要素: 一个变量有三个基本的要素,变量的名称,变量的类型,变量的值.所以int a = 10; 变量名为a,变量的存储类型为int型,变量的值为10. 变量还有一些属性如作用范围和存储类型. 变量作用范围和存储类型 作用范围有局部变量和全局变量.局部只在特定范围内起作用.全部变量在整个程序运行期间起作用. 存储类型有auto(自动),static(静态),register(寄存器变量) 自动变量auto默认省略,int a = 10; 和 auto int a = 10;是一样的.自动变量

【学习笔记】【C语言】变量类型

根据变量的作用域,可以分为: 1.局部变量: 1> 定义:在函数(代码块)内部定义的变量(包括函数的形参) 2> 作用域:从定义变量的那一行开始,一直到代码块结束 3> 生命周期:从定义变量的那一行开始分配存储空间,代码块结束后,就会被回收 4> 没有固定的初始值  2.全局变量 1> 定义:在函数外面定义的变量 2> 作用域:从定义变量的那一行开始,一直到文件结尾(能被后面的所有函数共享) 3> 生命周期:程序一启动就会分配存储空间,程序退出时才会被销毁 4&g

IOS开发系列--C语言之生存储方式和作用域

概述 基本上每种语言都要讨论这个话题,C语言也不例外,因为只有你完全了解每个变量或函数存储方式.作用范围和销毁时间才可能正确的使用这门语言.今天将着重介绍C语言中变量作用范围.存储方式.生命周期.作用域和可访问性. 变量作用范围 存储方式 可访问性 变量作用范围 在C语言中变量从作用范围包括全局变量和局部变量.全局变量在定义之后所有的函数中均可以使用,只要前面的代码修改了,那么后面的代码中再使用就是修改后的值:局部变量的作用范围一般在一个函数内部(通常在一对大括号{}内),外面的程序无法访问它,

C语言中变量的存储类型

在C语言中,对变量的存储类型说明有以下四种: auto 自动变量register   寄存器变量extern 外部变量static   静态变量 自动变量和寄存器变量属于动态存储方式,外部变量和静态变量属于静态存储方式. 在介绍了变量的存储类型之后,可以知道对一个变量的说明不仅应说明其数据类型,还应说明其存储类型. 因此变量说明的完整形式应为:存储类型说明符数据类型说明符变量名,变量名-:例如: static int a,b;      说明a,b为静态类型变量 auto char c1,c2;

变量的存储方式

变量分为静态存储方式和动态存储方式 静态存储方式是指在程序运行期间由系统分配固定的存储空间方式 动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式 C语言中每一个变量和函数都有两个属性:数据类型 和 数据的存储类别  存储类别指数据在内存中存储的方式(如静态存和动态存储和动态存储) C的存储类别包括4种:    自动的(auto) , 静态的(static), 寄存器(register),外部的(extern) // auto 变量 和 static变量 #include<std

golang语言学习第二课:变量类型及常量与枚举

go语言的变量类型: bool (true为0,false不等于0), string int 分好多种int,有点头晕,但用默认的int就足够了,根据机器判断,是32位的用int32,是64位的用int64. byte, 又是uint8的别名. rune(类似char,但是是utf-8编码的char),又是int32的别名. go语言没有float,只有float32, float 64(即使在32位的架构上还是64位) go语言原生支持复数类型,类似python, python也支持复数.go