diff options
Diffstat (limited to 'reference/C/CONCEPT/storage_class.html')
-rw-r--r-- | reference/C/CONCEPT/storage_class.html | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/reference/C/CONCEPT/storage_class.html b/reference/C/CONCEPT/storage_class.html new file mode 100644 index 0000000..884728e --- /dev/null +++ b/reference/C/CONCEPT/storage_class.html @@ -0,0 +1,219 @@ +<title>C Storage Classes</title> +<head> +</head> +<body bgcolor="#ffffcc"> +<center> +<hr> +<h1>C Storage Classes.</h1> +<hr> +</center> +<p> +C has a concept of '<i>Storage classes</i>' which are used to define the +scope (visability) and life time of variables and/or functions. +<p> +So what Storage Classes are available? +<p> +<table border=2 bgcolor=ivory> +<tr> +<td><a href="#auto">auto</a> +<td><a href="#register">register</a> +<td><a href="#static">static</a> +<td><a href="#extern">extern</a> +<td><A HREF="../SYNTAX/typedef.html">typedef</A> +</tr> +</table> +<p> +<hr> +<h2><a name="auto">auto - storage class</h2> +<b>auto</b> is the default storage class for local variables. +<pre> + { + int Count; + auto int Month; + } +</pre> + +The example above defines two variables with the same storage class. +auto can only be used within functions, i.e. local variables. <p> +<hr> +<h2><a name="register">register - Storage Class</h2> +<b>register</b> is used to define local variables that should be stored +in a register instead of RAM. This means that the variable has a maximum size +equal to the register size (usually one word) and cant have the unary '&' +operator applied to it (as it does not have a memory location). +<pre> + { + register int Miles; + } +</pre> +Register should only be used for variables that require quick access - such +as counters. It should also be noted that defining 'register' goes not mean +that the variable will be stored in a register. It means that it MIGHT be stored +in a register - depending on hardware and implimentation restrictions.<p> +<hr> +<h2><a name="static">static - Storage Class</h2> + +<a href="../SYNTAX/static.htm">Click here for static functions</a> +<p> +<b>static</b> is the default storage class for +<a href="../SYNTAX/glo_int_vars.html#global">global variables</a>. The two +variables below (<b>count</b> and <b>road</b>) both have a static storage class. +<p> +<center> +<table border=2 bgcolor=ivory width="50%"> +<tr> +<td> +<pre> + + static int Count; + int Road; + + main() + { + printf("%d\n", Count); + printf("%d\n", Road); + } +</pre> +</td> +</tr> +</table> +</center> +<p> + +'static' can also be defined within a function. If this is done, the variable +is initalised at compilation time and retains its value between calls. +Because it is initialsed at compilation time, the initalistation value +must be a constant. +This is serious stuff - tread with care. +<p> +<center> +<table border=2 bgcolor=ivory width="50%"> +<tr> +<td> +<pre> + + void Func(void) + { + static Count=1; + } +</pre> +</td> +</tr> +</table> +</center> +<p> +Here is an <a href="../EXAMPLES/static.c">example</a><p> + +<a name="static2"> +There is one very important use for 'static'. Consider this bit of code. +<p> +<center> +<table border=2 bgcolor=ivory width="50%"> +<tr> +<td> +<pre> + + char *Func(void); + + main() + { + char *Text1; + Text1 = Func(); + } + + char *Func(void) + { + char Text2[10]="martin"; + return(Text2); + } +</pre> +</td> +</tr> +</table> +</center> +<p> +'Func' returns a pointer to the memory location where 'Text2' starts +BUT Text2 has a storage class of <a href="#auto">auto</a> and will disappear +when we exit the function and could be overwritten by something else. The +answer is to specify: +<p> +<center> +<table border=2 bgcolor=ivory width="50%"> +<tr> +<td> +<pre> + + static char Text[10]="martin"; +</pre> +</td> +</tr> +</table> +</center> +<p> +The storage assigned to 'Text2' will remain reserved for the duration if the +program. + +<hr> +<h2><a name="extern">extern - storage Class</h2> +<b>extern</b> defines a global variable that is visable to ALL object +modules. When you use 'extern' the variable cannot be initalized as +all it does is point the variable name at a storage location that has +been previously defined. +<pre> + + + Source 1 Source 2 + -------- -------- + + + extern int count; int count=5; + + write() main() + { { + printf("count is %d\n", count); write(); + } } +</pre> + +Count in 'source 1' will have a value of 5. If source 1 changes the +value of count - source 2 will see the new value. Here are some example +source files. +<p> +<a href="../EXAMPLES/extern1.c">Source 1</a><br> +<a href="../EXAMPLES/extern2.c">Source 2</a><p> + +The compile command will look something like.<p> +<pre> + gcc source1.c source2.c -o program +</pre> + +<hr> +<h2>See Also:</h2> +<img src="../../GRAPHICS/whiteball.gif"> +<a href="data_types.html">Data types.</a> + + +<p> + +<hr> +<p> +<center> +<table border=2 width="80%" bgcolor="ivory"> +<tr align=center> +<td width="25%"> +<a href="../cref.html"> Top</a> +</td><td width="25%"> +<a href="../master_index.html"> Master Index</a> +</td><td width="25%"> +<a href="../SYNTAX/keywords.html"> Keywords</a> +</td><td width="25%"> +<a href="../FUNCTIONS/funcref.htm"> Functions</a> +</td> +</tr> +</table> +</center> +<p> +<hr> +<address>Martin Leslie +</address><p> +</body> +</html> |