📄 c45.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>变量的存储类型 </title>
<script language="javascript">
var prePage="http://www.nec.sjtu.edu.cn/support/Course/C/c/c4/c/c4/c44.htm";
var nextPage="c/c4/c46.htm";
</script>
<link rel="stylesheet" href="../cstyle.css" type="text/css">
<bgsound src="../voice/c45.au" loop="1">
</head>
<body background="../img/mainback.jpg" bgproperties="fixed">
<h2 align="center"><font face="楷体_GB2312"><a name="_top"></a>4.5 变量的存储类型</font></h2>
<div align="center"><center>
<table border="0" width="100%" cellspacing="0" cellpadding="0">
<tr>
<td width="20%" align="center"><font FACE="宋体" SIZE="3"><p ALIGN="center"><a
href="c45.htm#c451.html#c451">引言</a></font></td>
<td width="20%" align="center"><a href="c45.htm#c452.html#c452"><font FACE="宋体" SIZE="3">自动变量</font></a></td>
<td width="20%" align="center"><a href="c45.htm#c453.html#c453"><font FACE="宋体" SIZE="3">外部变量</font></a></td>
<td width="20%" align="center"><a href="c45.htm#c454.html#c454"><font FACE="宋体" SIZE="3">静态变量</font></a></td>
<td width="20%" align="center"><a href="c45.htm#c455.html#c455"><font FACE="宋体" SIZE="3">寄存器变量</font></a></td>
</tr>
</table>
</center></div>
<hr>
<h3><a name="c451"></a>1.<font FACE="宋体" SIZE="3">引言</font></h3>
<blockquote>
<font FACE="宋体" SIZE="3"><p ALIGN="JUSTIFY"><img src="../img/c451.gif"
alt="c451.jpg (4059 bytes)" align="right" WIDTH="293" HEIGHT="86">我们知道,
每一个变量都有一个类型。另外,
每一个变量都有一个存储类。变量的存储类是由它被定义的地方决定的,
并且, 如果用了关键字,
则还要由关键字决定。有四个关键字描述存储类<font SIZE="3">: extern,
auto, static </font>和<font SIZE="3"> register</font>。</p>
<p ALIGN="JUSTIFY">存储类决定了两件事, 第一,
它控制哪些函数可以访问一个变量,第二,
存储类决定了变量在内存中的时间。</p>
</font><p ALIGN="right"><a href="c45.htm#_top.html#_top">返回页首</a></p>
</blockquote>
<hr>
<font FACE="宋体" SIZE="3">
<h3 ALIGN="JUSTIFY"><a name="c452"></a>2.自动变量</h3>
</font>
<blockquote>
<font FACE="宋体" SIZE="3"><p ALIGN="JUSTIFY">在一个函数中说明的变量,
其类型缺省为自动类的。然而, 你可以用关键字 auto 来清楚地表示:<br>
main()<br>
{<br>
auto int plox;<br>
....</p>
<p ALIGN="JUSTIFY">一个自动类变量是局部范围的。仅仅定义此变量的函数知道此变量。其它函数可以有同一名字的变量,
但它们是独立的变量, 并且可能存储在不同的内存位置。</p>
<p ALIGN="JUSTIFY">现在, 我们看一个例子:<br>
</p>
<!-- Aftershock c452.swf 3=550 4=370 40 -->
<p>
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://active.macromedia.com/flash2/cabs/swflash.cab#version=3,0,0,0" ID="c452"
WIDTH="550" HEIGHT="370">
<param name="movie" value="../movie/c452.swf">
<param name="quality" value="autohigh">
<param name="bgcolor" value="#FFFFCC"><embed SRC="../movie/c452.swf" swLiveConnect="FALSE" WIDTH="550" HEIGHT="370"
QUALITY="autohigh" BGCOLOR="#FFFFCC" TYPE="application/x-shockwave-flash"
PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">
</object>
</p>
<!-- EndAftershock c452.swf -->
<p ALIGN="right"></font><a href="c45.htm#_top.html#_top">返回页首</a><font FACE="宋体"
SIZE="3"></p>
</font>
</blockquote>
<hr>
<font FACE="宋体" SIZE="3">
<h3 ALIGN="JUSTIFY"><a name="c453"></a>3.外部变量</h3>
</font>
<blockquote>
<font FACE="宋体" SIZE="3"><p ALIGN="JUSTIFY">在一个函数外部定义的变量是外部的。一个外部变量也必须在用到它的函数中说明后才能使用;
这可以用extern显式地说明,
也可由上下文隐含地说明。一个外部变量在程序运行时都存在,
而不是限制在某个函数中。</p>
<p ALIGN="JUSTIFY">说明如下: </p>
<p ALIGN="JUSTIFY">/* 三个外部定义的变量 */<br>
int errupt ;<br>
char coal;<br>
double up;<br>
main()<br>
{<br>
/* 说明那三个外部定义的变量 */<br>
extern int errupt;<br>
extern char coal;<br>
extern double up;<br>
....</p>
<p ALIGN="JUSTIFY">有两种情形,
你必须在使用一个外部变量之前先用关键字 extern 说明它 。</p>
<p ALIGN="JUSTIFY">情形 1: 如果你在一个文件中,
要在一个外部变量的定义之前使用它, 那么你必须在用之前先用 extern
来说明它。看一个例子: <br>
</font><font face="宋体">try()<br>
{<br>
<font color="#008080"><strong>extern int i;</strong>
</font> <font color="#FF0000"><--- i必须先用</font><br>
i=i+5;<br>
...<br>
}<br>
...<br>
<font color="#008080"><strong>int i;</strong></font>
<font color="#FF0000"><---i在后面定义 </font></font><font FACE="宋体"
SIZE="3"></p>
<font SIZE="2"><p></font></font><font face="宋体">情形 2: </font><font FACE="宋体"
SIZE="3">如果不在一个文件中,如</font><font face="宋体"><font size="3"> </font>FILE1
和 FILE2 是两个不同的文件。我们想在 FILE1 用变量 i (它的类型是 int),
但它是在 FILE2 中定义的。我们必须在<font size="3"> </font>FILE1 中说明 i
: <font color="#008080"><strong>extern int i;</strong></font></font></p>
<font FACE="宋体" SIZE="3"><p ALIGN="JUSTIFY">只要 extern
的说明的最初定义是在同一个文件中, 并且是在使用它的函数之前,
就可以忽略它。<br>
这里有一个例子: <br>
/* 定义一个外部变量 */<br>
int hocus ;<br>
main()<br>
{<br>
/*hocus 没有说明 */<br>
hocus++ ;<br>
/* hocus 是外部的尽管它在 main()函数中没有被显式的说明。*/<br>
....</p>
<p ALIGN="JUSTIFY"> /* hocus 是 1auto 类型的 */<br>
int hocus ; <br>
...</p>
</font><p ALIGN="right"><a href="c45.htm#_top.html#_top">返回页首</a></p>
</blockquote>
<hr>
<font FACE="宋体" SIZE="3">
<h3 ALIGN="JUSTIFY"><a name="c454"></a>4.静态变量</h3>
</font>
<blockquote>
<font FACE="宋体" SIZE="3"><p ALIGN="JUSTIFY">在 C 语言中, 有一种特殊的变量:
静态变量。<br>
你可以如下方式说明: <br>
main()<br>
{<br>
... <br>
static int i; <br>
...<br>
}</p>
<p ALIGN="JUSTIFY">现在, 我们看一个例子: </p>
<!-- Aftershock c453.swf 3=550 4=370 40 -->
<p>
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://active.macromedia.com/flash2/cabs/swflash.cab#version=3,0,0,0" ID="c453"
WIDTH="550" HEIGHT="370">
<param name="movie" value="../movie/c453.swf">
<param name="quality" value="autohigh">
<param name="bgcolor" value="#FFFFCC"><embed SRC="../movie/c453.swf" swLiveConnect="FALSE" WIDTH="550" HEIGHT="370"
QUALITY="autohigh" BGCOLOR="#FFFFCC" TYPE="application/x-shockwave-flash"
PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">
</object>
</p>
<!-- EndAftershock c453.swf -->
<a href="c45.htm#_top.html#_top"><p align="right">返回页首</a></font></p>
</blockquote>
<hr>
<font FACE="宋体" SIZE="3">
<h3 ALIGN="JUSTIFY"><a name="c455"></a>5.寄存器变量</h3>
</font>
<blockquote>
<font FACE="宋体" SIZE="3"><p ALIGN="JUSTIFY">通常变量是存在计算机内存中的。幸运的话,
寄存器变量被存在 CPU 的寄存器中,
在寄存器中可以比在内存中更快地访问和操作变量。在其它方面,
寄存器变量和动态类变量几乎一样。</p>
<p ALIGN="JUSTIFY">按这种方式设置寄存器变量: <br>
main()<br>
{<br>
/* i是普通变量 */<br>
int i;<br>
/* j是寄存器变量 */<br>
register int j;<br>
.. .</p>
<p ALIGN="JUSTIFY">如果得不到寄存器,
寄存器变量变成了普通的自动类变量。访问 j 比访问 i 快多了! </p>
</font>
</blockquote>
<p align="right"><a href="c45.htm#_top.html#_top">返回页首</a></p>
<p align="center"><a href="http://www.nec.sjtu.edu.cn/support/Course/C/c/c4/c46.htm"><img src="../img/next.gif" width="145" height="30"
alt="next.gif (3633 bytes)" border="0"></a></p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -