首页天道酬勤c语言的数据类型包括,c语言存储类型

c语言的数据类型包括,c语言存储类型

张世龙 05-04 02:40 71次浏览

c语言对变量的存储类型有四种说明:

自动变量(动态存储) )

register寄存器变量(动态存储器) ) ) ) ) ) ) )。

extern外部变量(静态存储) ) ) ) ) ) ) ) ) )。

静态静态变量(静态存储)

存储类型是变量占用内存空间的方式,也称为存储方式。

这四种类型是扩展静态输入=200; 错了; 只能指定一种存储类型; 例如; 静态Int a=200; 或扩展输入a;

变量的存储方法有“静态记忆”和“动态记忆”两种。

静态存储器变量:定义时保持在存储单元中; 直到程序结束。

动态记忆变量:程序运行时; 使用他时首次分配存储器单元,使用结束后立即释放,用于分配。

根据以上分析可知,静态存储变量始终存在,动态存储变量存在或消失。

一个变量属于哪个存储方式,不能仅靠其变量作用域(文件、函数体、代码块、函数声明)来判断,还需要明确的存储类型说明。

例如,静态输入a=20;

变量说明的完整格式为:【存储类型描述符】【数据类型描述符】【变量名、变量名.】;

一、从作用域看:

1 )全局变量

有全局范围。 全局变量只需在一个源文件中定义,即可应用于所有源文件。

当然,其他不包含全局变量定义的源文件必须使用extern关键字再次声明此全局变量。

2 )静态局部变量(仅在自己的函数内看起来有效) ) ) ) ) )。

静态局部变量具有局部范围,它只初始化一次,从最初初始化到程序运行结束都存在

与全局变量的区别在于全局变量对所有函数都是可见的。

另一方面,静态局部变量只对定义自己的函数体始终显示。

局部变量也只有局部范围。 它是自动对象(auto ),并不是在程序运行时一直存在。

仅在函数执行过程中存在,在执行完函数的一次调用后取消变量。

使用的内存也被回收。

静态全局变量也有全局作用域。 与全局变量的区别在于,如果程序包含多个文件,

它作用于定义它的文件,而不作用于其他文件。

也就是说,用static关键字修饰的变量具有文件范围。

因此,即使在两个不同的源文件中定义了同名的静态全局变量,它们也是不同的变量。

二、从分配空间看:

全局变量、静态局部变量和静态全局变量都为静态存储分配空间,局部变量为堆栈分配空间。

全局变量本身是静态存储方法,静态全局变量当然也是静态存储方法。

两者的保存方法都没有区别。 这种差异在于,非静态全局变量的范围是整个源程序。

如果源程序由多个源文件组成,则非静态全局变量对每个源文件都有效。 静态全局变量限制作用域。 这意味着它只在定义变量的源文件中有效,不能在同一源程序的其他源文件中使用。 静态全局变量的范围仅限于一个源文件中,并且仅对该源文件中的函数通用,因此可以避免其他源文件中发生错误。

)1)静态变量放置在程序的静态数据存储(看起来全局)中,在下一次调用时也可以保持原始赋值。 这一点与堆栈变量和堆变量不同。

)2)变量用static通知编译器,自己只能在变量的作用范围内看到。 这是与全局变量的不同。

以上分析表明,将全局变量更改为静态变量后,更改保存方法将更改生存期。 将全局变量更改为静态变量会改变范围,限制使用范围。 因此,静态这个说明符所起的作用因地点而异。 需要注意的事情:

Tips :

a .如果全局变量只能在单个c文件中访问,则可以将此变量更改为静态全局变量以降低模块之间的耦合度。

b .如果全局变量仅由单个函数访问,则可以将此变量更改为该函数的静态局部变量,以降低模块之间的耦合度。

c .设计和使用访问动态全局变量、静态全局变量和静态局部变量的函数时,由于它们位于静态数据存储中,因此全局可见,需要考虑重新导入问题;

d .如果需要可重新输入的函数,则必须避免在函数中使用静态变量。 这样的函数称为具有“内部内存”功能的函数。

e .如果函数必须使用静态变量:例如,如果一个函数的返回值是指针类型,则返回值必须是静态的局部变量的地址;如果是auto类型,则作为错误的指针返回。

其他说明:

变量的存储类型

自动输入a=10; 自动变量系统的默认值都是自动变量,不初始化默认值; 产生随机数

静态Int a=20; 默认值被初始化; 只初始化一次; 整个生命周期的过程

扩展Int a; 默认情况下初始化外部变量(全局变量)。 仅初始化整个生命周期一次

注册器int a; 保存在cpu寄存器中; 不能使用静态

修饰;并且只能是局部变量、要求性能高的时候用

如:

register int y = 10; //错误

int get(){

register int x = 10; //正确

}

函数的局部变量

{

作用域只在函数体内;//压到栈 ,使用完后会被弹出释放;

}

文件main.c

#include

/*

auto 自动变量

register 寄存器变量

extern 外部变量

static 静态变量

*/

int a = 100; //全局变量 其他文件可以用extern调用

//register int x = 10; //错误

extern void get();

static int name2 = 490; //全局静态变量 其他文件无法使用

int main()

{

get(); //分配1次 栈的空间有可能不是同一个

get(); //分配1次 栈的空间有可能不是同一个

get(); //分配1次 栈的空间有可能不是同一个

return 0;

}

文件1:

#include

int abc = 2; //默认auto类型 //

static int name = 8890;

//extern static int name2; //错误;不允许定义2个存储类型

void get(){

extern int a;//引用全局变量

int aa = a;

a++;

auto int b = 20;

b++;

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

c++;

register int r =30;

r++;

name++;

abc++;

printf("a=%d b=%d c=%d r=%d name=%d abc=%d\n",aa,b,c,r,name,abc);

}

//局部变量在栈上

/* 用户空间

(栈【局部变量】、堆、数据段【全局变量(静态全局,静态局部,动态变量)】、代码段)

*/

//全局变量在数据段存储

/* 数据段包括两部分(静态存储区、动态存储区)

静态存储区

全局变量(非静态,静态的全局;静态局部变量)

静态变量(全局和局部2种静态)

data初始化区

bss未出化区

全部变量: auto int a; static int a; 函数内部的局部静态变量static int b;

静态变量就分全局和局部2种;

*/

C语言中变量的存储类型

在C语言中,对变量的存储类型说明有以下四种: auto 自动变量register   寄存器变量extern 外部变量static   静态变量 自动变量和寄存器变量属于动态存储方式,外部变量和静态变 ...

C语言中变量的存储方式

变量可以分为全局变量.静态全局变量.局部变量和静态局部变量变量的声明有两种情况:1)一种是需要建立存储空间的(定义性声明).例如int a 在生命的时候就已经建立了存储空间.2)另一种是不需要建立存储 ...

C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期

全局变量 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件.) 生命周期:程序运行期一直存在 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量. 内 ...

C语言中变量和函数的作用域和链接属性

C语言中变量和函数的作用域和链接属性 作用域 代码块作用域: 代码块指的是使用"{}"包围起来的部分. 在代码块中定义的变量,代码块之外是不能访问的. 代码块嵌套之后的变量作用域, ...

C语言中变量、全局变量与变量的作用域

什么是变量: 变量常量都是表征数据的一种形式:常量用来表示数据的值: 变量不仅可以用来表示数据的值:还可以用来存放数据:因为变量对应着一定的内存单元: 变量和常量必须先定义后使用. 变量名和常量名都是 ...

C语言中变量的作用域和生命周期

变量的类型: 1. 局部变量和全局变量 局部变量也称为内部变量. 局部变量是在函数内作定义说明的.其作用域仅限于函数内, 离开该函数后再 使用这种变量是非法的. 全局变量也称为外部变量,它是在函数外部 ...

c语言中变量和函数作用域深究

首先,函数的作用域和访问权限基本可以参考 C语言中的作用域,链接属性和存储类型 也存在例外情况,比如内联函数 static inline,使用static 修饰 inline之后外部文件也可以访问内联 ...

C语言中变量名及函数名的命名规则与驼峰命名法

一.C语言变量名的命名规则:(可以字母,数字,下划线混合使用) 1. 只能以字母或下划线开始:2. 不能以数字开始:3. 一般小写:4. 关键字不允许用(eg:int float=2//error  ...

【转载】java 中变量的存储位置

原文链接点这里,感谢博主分享 * 寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. * 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出 ...

随机推荐

Linux上服务的启动,停止和重启

(1)查看所有的服务 [berry@berry:practice] service Usage: service < option > | --status-all | [ service ...

c&num; 财务数据编号的生辰

实现逻辑: 根据票号前戳+生成的6位数据编号=收据号(010+000001=010000001) 作废票号      将票号作废,插入到编号表中,以此下次在使用 作废票号使用 编号表中 现在只有2,当 ...

JavaScript高级程序设计37&period;pdf

用DOM范围实现简单选择 selectNode()和selectNodeContents()它们都接收一个DOM节点参数,然后使用该节点中的信息来填充范围,其中selectNode()方法选择整个节点 ...

react项目的react-router-dom路由的使用

现在测试一下react-router-dom路由的使用,首先在App.js这个文件搭配路由 import React, { Component } from 'react'; import {Link ...

【java】for循环嵌套

循环嵌套:外循环控制行数,内循环控制每一行的列数,也就是每一行的元素个数 需求:打印出9*9的乘法表 class Demo { public static void main(String[] arg ...

如何使用SetTimer

1.SetTimer定义在那里? SetTimer表示的是定义个定时器.根据定义指定的窗口,在指定的窗口(CWnd)中实现OnTimer事件,这样,就可以相应事件了. SetTimer有两个函数.一个 ...

SPSS学习系列之SPSS Statistics(简称SPSS)是什么?

不多说,直接上干货! IBM SPSS Statistics 为业务经理和分析人员提供解决基本业务和研究问题所需的核心统计过程.该软件提供的工具使用户能够快速查看数据.为其他测试拟定假设情况.执行澄清 ...

Good Bye 2015 C

C. New Year and Domino time limit per test 3 seconds memory limit per test 256 megabytes input stand ...

Jpeg-Baseline和Progressive JPEG的区别

原文来自 http://www.hdj.me/use-progressive-jpeg-in-web 看着不错,于是粘贴了过来 今天才认识到原来JPEG文件有两种保存方式他们分别是Baseline J ...

NHibernate二级缓存&lpar;第十一篇&rpar;

NHibernate二级缓存(第十一篇) 一.NHibernate二级缓存简介 NHibernate由ISessionFactory创建,可以被所有的ISession共享. 注意NHibernate查 ...

java语言不支持指针,结构体指针如何初始化