㈠ 当变量的存储类型定义缺省时,系统默认为变量的存储类型为 c语言
当变量的存储类型定义缺省时,系统默认为变量的存储类型为auto类型,分配在静态区.
㈡ 系统什么时候为变量分布存储单元
系统什么时候为变量分布存储单元?系统在早上的时候也就是在12:00准时的时候,这个时候会变量分布纯属单位,因为他这种时候是比较敏感的,一个时候也就会成为它的变量分布,因为它这个变量分布纯属单元的话,所以它是需要变到这个单元格式,所以它需要存储单元,所以系统一般是在自动设定的时候,也就是在更新的时候会变量分布存储单元
㈢ 在变量寄存器中,变量什么为独立存储器
寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成。下面小编给大家介绍一下“寄存器变量是什么变量 寄存器变量怎么用”
一、寄存器变量是什么变量
在程序运行时,根据需要到内存中相应的存储单元中调用,如果一个变量在程序中频繁使用,例如循环变量,那么,系统就必须多次访问内存中的该单元,影响程序的执行效率。因此,C语言\C++语言还定义了一种变量,不是保存在内存上,而是直接存储在CPU中的寄存器中,这种变量称为寄存器变量。
寄存器变量的定义形式是:
register 类型标识符 变量名
寄存器是与机器硬件密切相关的,不同类型的计算机,寄存器的数目是不一样的,通常为2到3个,对于在一个函数中说明的多于2到3个的寄存器变量,C编译程序会自动地将寄存器变量变为自动变量。
由于受硬件寄存器长度的限制,所以寄存器变量只能是char、int或指针型。寄存器说明符只能用于说明函数中的变量和函数中的形参,因此不允许将外部变量或静态变量说为"register"。
register型变量常用于作为循环控制变量,这是使用它的高速特点的最佳场合。
register[寄存器]变量告诉编译器相关的变量应该改量存储在高速度的寄存器中。使用register存储类型的目的一般是为了提高执行速度,但是,register声明只是向编译器所提出的“建议”,并非强制要求。
(图片来源于互联网)
二、寄存器变量怎么用
以下为一个寄存器变量的声明:
register int variable;
寄存器变量:如果访问过于频繁,可使用此变量直接从寄存器访问。
eg.
#include <stdio.h> /*编译预处理指令*/
int sum ( int n );
/*一个函数声明语句,sum(...)是一个名字叫sum的函数声明,前边的int说明该函数的返回值是整型;(int n)说明传递函数的形参是一个整型变量*/
int main () /*主函数的函数头*/
{
int i , s; /*定义整型变量i,s*/
for ( i=1 ; i < = 5 ; i++ )
/*循环语句,首先执行 i = 1;
赋初值,再执行 i < =5;
判断是否符合条件,如果符合就执行 { } 里循环体的语句,执行完后,再执行 i ++ 运算,i ++ 等价于 i = i +1;
再执行 i < = 5 进行条件判断,如果符合就执行 { } 里循环体的语句,不符则跳出循环*/
printf ( " 前 % d 个自然数的和是 % d \n ", i, sum ( i ) );
/*第一个 % d 对应的是 i ,第二个 %d 对应的是 sum ( i ),sum ( i )是一个函数,返回值是int ;
第二个 % d 是整型的,所以第二个 sum ( i ) 返回前 i 项和*/
int sum ( int n )
/*定义一个返回值是整型的函数 sum ,它接受一个整型参数变量n*/
{
register int i , s = 0 ; /*定义寄存器变量*/
for ( i = 1 ; i < = n ; i ++ ) /*循环 n 次 */
s + = i ; /*赋值语句,等价于 s = s + i */
return s ; /*函数返回值*/
}
写此程序的目的:测试寄存器变量的用法,像以上内容,如果频繁访问 i 的值,则可以使用寄存变量。
register要与不要的区别:
凡是声明为 register 的变量,操作系统都会企图将其放入寄存器中以加快速度,如果寄存器中满了,则将由计算机硬件将寄存器中最久未使用的变量调入到高速缓冲存储器(Cache) 中,同时放入你的变量。
寄存器是CPU的一部分,所以其访问速度会远远高于同内存的访问速度。
㈣ c语言变量的储存类别及各自的特点
你自己根据需要归纳吧~
C语言变量存储类型
auto
static
extern
static extern
register
auto 局部变量
auto 变量是用堆栈(stack)方式占用储存器空间,因此,当执行此区段是,系统会立即为这个变量分配存储器空间,而程序执行完后,这个堆栈立即被系统收回.在大括号{}内声明.
自动变量就是指在函数内部定义使用的变量。他只是允许在定义他的函数内部使用它。在函数外的其他任何地方都不能使用的变量。自动变量是局部变量,即它的区域性是在定义他的函数内部有效。当然这说明自动变量也没有链接性,因为它也不允许其他的文件访问他。由于自动变量在定义他的函数的外面的任何地方都是不可见的,所以允许我们在这个函数外的其他地方或者是其他的函数内部定义同名的变量,他们之间不会发生冲突的。因为他们都有自己的区域性,而且它没有链接性(即:不允许其他的文件访问他的)。来看看自动量的持续性。计算机在执行这个函数的时候,创建并为它分配内存,当函数执行完毕返回后,自动变量就会被销毁。这个过程是通过一个堆栈的机制来实现的。为自动变量分配内存就压栈,而函数返回时就退栈。
static 静态变量
一、局部静态变量
局部变量按照存储形式可分为三种auto, static, register。
与auto类型(普通)局部变量相比, static局部变量有三点不同:
1. 存储空间分配不同
auto类型分配在栈上, 属于动态存储类别, 占动态存储区空间, 函数调用结束后自动释放, 而static分配在静态存储区, 在程序整个运行期间都不释放. 两者之间的作用域相同, 但生存期不同.
2. static局部变量在所处模块在初次运行时进行初始化工作, 且只操作一次。
3. 对于局部静态变量, 如果不赋初值, 编译期会自动赋初值0或空字符, 而auto类型的初值是不确定的.
特点: static局部变量的”记忆性”与生存期的”全局性”
所谓”记忆性”是指在两次函数调用时, 在第二次调用进入时, 能保持第一次调用退出时的值.
注意事项:
1. “记忆性”, 程序运行很重要的一点就是可重复性, 而static变量的”记忆性”破坏了这种可重复性, 造成不同时刻至运行的结果可能不同.
2. “生存期”全局性和唯一性. 普通的local变量的存储空间分配在stack上, 因此每次调用函数时, 分配的空间都可能不一样, 而static具有全局唯一性的特点, 每次调用时, 都指向同一块内存, 这就造成一个很重要的问题 ---- 不可重入性!!!
二、外部静态变量/函数
在C中static有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。, 但为了限制全局变量/函数的作用域, 函数或变量前加static使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。注意此时, 对于外部(全局)变量, 不论是否有static限制, 它的存储区域都是在静态存储区, 生存期都是全局的. 此时的static只是起作用域限制作用, 限定作用域在本模块(文件)内部.
使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。
extern 变量
外部变量 定义在程序外部,所有的函数很程序段都可以使用.
外部变量可能会在某一程序段被重新定义,以段内变量为参考值.
static extern 变量
静态外部变量和外部变量差别在于,外部变量生命可以同时给多个文件使用,而静态外部变量则只能给声明此变量的文件使用.
register 变量
寄存器变量,是由寄存器分配空间,访问速度比访问内存快,加快执行速度.寄存器大小有限.
在c语言当中可以使用寄存器变量来优化程序的性能,最常见的是在一个函数体当中,将一个常用的变量声明为寄存器变量: register int ra; 如果可能的话,编译器就会为它分配一个单独的寄存器,在整个函数执行期间对这个变量的操作全都是对这个寄存器进行操作,这时候就不用频繁地去访存了,自然就提高了性能。
不能用于全局变量。现在的情况是VC忽略用户定义的REGISTER,因此定义一个REGISTER变量与不定义一个REGISTER是一样的,编译器进行相同的优化,因为MS认为,REGISTER是系统中宝贵的资源,应该由系统统一调配,而且认为VC编译器的优化能力要大于一般的程序员。因此也有人说register关键字在PC机(x86CPU)无用,编译器按自动变量处理。
注意: register是不能取址的。
register int j; int *p = &j;是错的,因为无法对寄存器的寻址。
㈤ 系统存储过程和系统变量的关系
互利共存。系统存储过程和系统变量的关系是互利共存。存储系统是指计算机中由存放程序和数据的各种存储设备、控制部件及管理信息调度的设备(硬件)和算法(软件)所组成的系统。
㈥ 计算机系统中的存储器系统是指ram存储器
1 . 计算机的RAM(Random Access Memory)的别名为随机存取记忆体,它相当于计算机上的移动存储,用来存储和保存数据的。它在任何时候都可以读写,RAM通常是作为操作系统或其他正在运行程序的临时存储介质(可称作系统内存)。
㈦ 变量的存储类型
我们在程序中会经常定义一些变量来保存和处理数据。从本质上看,变量代表了一段可操作的内存,也可以认为变量是内存的符号化表示。当程序中需要使用内存时,可以定义某种类型的变量。此时编译器根据变量的数据类型分配一定大小的内存空间。程序就可以通过变量名来访问对应的内存了。
如果说变量的数据类型决定了对应内存的大小,那么存储类型则影响着对应内存的使用方式。所谓使用方式,具体说就是在什么时间、程序的什么地方可以使用变量,即变量的生命周期和作用域。
先了解一些基本常识。一、在程序运行时内存中有三个区域可以保存变量:静态存储区、栈(stack)和堆(heap)。二、根据变量定义的位置可分为全局变量(定义在函数体外的变量)和局部变量(定义在函数体内的变量,包括形参)。
所有的全局变量和静态局部变量(定义时使用关键字static)都保存在静态存储区,其特点是:在编译时分配内存空间并进行初始化。在程序运行期间,变量一直存在,直到程序结束,变量对应的内存空间才被释放。
而所有的非静态局部变量(又称为自动变量)保存在栈(stack)中,其特点是:在变量所在的函数或模块被执行时动态创建,函数或模块执行完时,变量对应的内存空间被释放。换句话说,函数或模块每被执行一次,局部变量就会重新被分配空间。如果变量定义时没有初始化,那么变量中的值是随机数。
所有用malloc分配的内存(又称为动态内存)都在堆(heap)中,其特点是:一般通过指针来访问动态分配的内存。即可以通过free来手动释放动态内存,也可以在程序结束时由系统自动释放。
以上讨论的是变量的生命周期,下面来看作用域。作用域指的是变量的可见范围,即在变量的生命周期内,程序的哪些部分可以使用该变量。
全局变量的作用域从定义点开始一直到源文件的结束。如果要在定义点之前使用全局变量的话就需要使用关键字extern对作用域进行扩展。全局变量缺省是可以被其他文件引用的。如果希望仅限于本文件使用的话,需要在定义时使用关键字static。
对于局部变量来说,无论是静态局部变量还是自动变量,作用域都仅限于定义该变量的函数或模块。
动态内存只要没有被释放就可以在程序的任何地方使用,前提是要知道动态内存的地址。
注:static加在全局变量前影响的是作用域,加在局部变量前影响的是生命周期。
㈧ 请教变量数据在内存中的存储方式,比如int a=2,那么在内存中是怎么存储的呢
额 你理解错了 。 跟本就不存在a的ASCII码值。
这样看:定义了一个变量,给它取个名字叫a,这个名字是给你程序员看的,计算机跟本不看这个a,a对计算机来说只是一个标识,它标识着在内存中所占用的一个大小为4B的内存空间,并且!这4B的空间存放一个整数,其值为2. 而在存储的时候是这样存的
由于内存的最小单位是字节,也就是1B是最小的单位,而一个int类型的数据在32的系统中要占用32位大小, 换算一个 8位=1字节 即8bit=1B 那么32位=4字节。 这个2转换成二进制数是10 ,但计算机要求用32位的数来存放这个2 ,咋办? 补0呗。在哪补? 肯定不能在后边补啊,那就变成别的数了—— 那,那就在前补。
所以是00000000 00000000 00000000 00000010
以上便是2这个数在计算机内存中的形式, 每8位一组分成4组刚好是4B大小,所以内存中就有连着的4个内存单元 来存放这个数值2. 而这一内存单元我们把它叫做a, 计算机也正是通过这个名字来标识这个数。
综上,总结一下,a这个字母是给程序员看的, 计算机不认识a这字母,a在计算机中仅仅是转换为一个计算机用于标识这个数值2的其它的什么东西。 具体是什么东西你不必要了解,其实我也不知道。而这个2在内存中存放的形式是占用4个内存单元的空间。
楼主想更深入了解这方面,建议把C语言学一遍后学学汇编语言就很清楚了