----------------
變量
4.1 變量說明
Turbo C2.0規定所有變量在使用前都必須中以說明。一條變量說明語句由數據類型和其後的一個或多個變量名組成。變量說明的形式如下:
類型 <變量表>;
這裏類型是指Turbo C2.0的有效數據類型。變量表是一個或多個標識符名, 每個標識符之間用","分隔。
例如:
int i, j, k; unsigned char c, str[5], *p;
4.2 變量種類
變量可以在程序中三個地方說明: 函數內部、函數的參數定義中或所有的函數外部。根據所定義位置的不同, 變量可分爲局部變量、形式參數和全程變量。
一、局部變量
局部變量是指在函數內部說明的變量(有時也稱爲自動變量)。用關鍵字auto進行說明, 當auto省略時, 所有的非全程變量都被認爲是局部變量, 所以auto實際上從來不用。
局部變量在函數調用時自動產生, 但不會自動初始化, 隨函數調用的結束, 這個變量也就自動消失了, 下次調用此函數時再自動產生, 還要再賦值, 退出時又自動消失。
二、形式參數
形式參數是指在函數名後面的小括號裏定義的變量, 用於接受來自調用函數的參數。形式參數在函數內部可以象其它局部變量那樣來作用。
例如:
puthz(int x, int y, int color, char *p)
{
int i, j, k; /*定義局部變量*/
<程序體>
}
其中x, y, color, *p爲函數的形式參數, 不需要再進行說明就可在該函數內直使用。
三、全程變量
全程變量是指在所有函數之外說明的變量, 它在整個程序內部者是"可見的",可以被任何一個函數使用, 並且在整個程序的運行中都保留其值。全程變量只要滿 足在使用它以前和函數以外這兩個條件, 可在程序的任何位置進行說明, 習慣上通常在程序的主函數前說明。
例如:
#include<stdio.h>
int test; /*定義全程變量*/
void f1(int x, float y); /*子函數說明*/
void f2(void); /*子函數說明*/
main()
{
test=5; /*給全程變量賦值*/
f1(20, 5.5); /*調用有形式參數的子函數f1()*/
/*test的值變成115*/
f2(); /*調用f2(), test的值變爲1150*/
}
void f1(int x, float y)
{
float z; /*z定義爲局部變量*/
z=x*y; /*計算*/
test=test+z;
}
void f2(void)
{
int count=10; /*定義局部變量並初始化*/
test=test*count;
}
由於全程變量可被整個程序內的任何一個函數使用, 所以可作爲函數之間傳遞參數的手段, 但全程變量太多時, 內存開銷變大。
4.3 變量存儲類型
Turbo C2.0支持四種變量存儲類型。說明符如下:
auto static extern register
下面分別來介紹。
一、auto
auto稱爲自動變量, 已在前面作了介紹, 這裏不再重複。
二、static
static稱爲靜態變量。根據變量的類型可以分爲靜態局部變量和靜態全程變量。
1. 靜態局部變量
它與局部變量的區別在於: 在函數退出時, 這個變量始終存在, 但不能被其它函數使用, 當再次進入該函數時, 將保存上次的結果。其它與局部變量一樣。
2. 靜態全程變量
Turbo C2.0允許將大型程序分成若干獨立模塊文件分別編譯, 然後將所有模塊的目標文件連接在一起, 從而提高編譯速度, 同時也便於軟件的管理和維護。靜態全程變量就是指只在定義它的源文件中可見而在其它源文件中不可見的變量。它與全程變量的區別是: 全程變量可以再說明爲外部變量(extern), 被其它源文件使用,而靜態全程變量卻不能再被說明爲外部的, 即只能被所在的源文件使用。
三、extern
extern稱爲外部變量。爲了使變量除了在定義它的源文件中可以使用外, 還要被其它文件使用。因此, 必須將全程變量通知每一個程序模塊文件, 此時可用extern來說明。
例如:
文件1爲file1.c 文件2爲file2.c
int i, j;/*定義全程變量*/ extern int i, j;/*說明將i, j從
文件1中複製過來*/
char c; extern char c; /*將c複製過來*/
void func1(int k); func2() /*用戶定義函數*/
{
main() static float k;/*定義靜態變量*/
{ i=j*5/100;
func1(20);/*調用函數*/ k=i/1.5;
func2(); .
. .
. .
. }
}
func1(int k) /*用戶定義函數*/
{
j=k*100;
}
對於以上兩個文件file1.c和file2.c, 用Turbo C2.0的集成開發環境進行編譯連接時, 首先應建立一個.prj的文件。例如file.prj, 該文件內容如下:
file1.c
file2.c
然後將file.prj的文件名寫入主菜單Project中的Project Name項中。 再用F9編譯連接, 就可產生一個文件名爲fioe.exe的可執行文件。
外部變量和FORTRAN語言中的COMMOM定義的公共變量一樣。
四、register
register稱爲寄存器變量。它只能用於整型和字符型變量。定義符register說明的變量被Turbo C2.0存儲在CPU的寄存器中, 而不是象普通的變量那樣存儲在內存中, 這樣可以提高運算速度。但是Turbo C2.0只允許同時定義兩個寄存器變量,一旦超過兩個, 編譯程序會自動地將超過限制數目的寄存器變量當作非寄存器變量
來處理。因此, 寄存器變量常用在同一變量名頻繁出現的地方。
另外, 寄存器變量只適用於局部變量和函數的形式參數, 它屬於auto型變量,因此, 不能用作全程變量。定義一個整型寄存器變量可寫成:
register int a;
對於以上所介紹的變量類型和變量存儲類型將會在以後的學習中, 通過例行程序中的定義、使用來逐漸加深理解。
4.4 數組變量
所謂數組就是指具有相同數據類型的變量集, 並擁有共同的名字。數組中的每個特定元素都使用下標來訪問。數組由一段連續的存貯地址構成, 最低的地址對應於第一個數組元素, 最高的地址對應最後一個數組元素。數組可以是一維的、也可以是多維的。Turbo C2.0象它高級語方一樣也使用數組變量。
一、一維數組
一維數組的說明格式是:
類型 變量名[長度];
類型是指數據類型, 即每一個數組元素的數據類型, 包括整數型、浮點型、字
符型、指針型以及結構和聯合。
例如:
int a[10];
unsigned long a[20];
char *s[5];
char *f[];
說明:
1. 數組都是以0作爲第一個元素的下標, 因此, 當說明一個int a[16] 的整型數組時, 表明該數組有16個元素, a[0]~a[15], 一個元素爲一個整型變量。
2. 大多數字符串用一維數組表示。數組元素的多少表示字符串長度, 數組名錶示字符串中第一個字符的地址, 例如在語句char str[ 8] 說明的數組中存入"hello"字符串後, str表示第一個字母"h"所在的內存單元地址。str[0] 存放的是字母"h"的ASCII碼值, 以此類推, str[4]存入的是字母"o"的ASCII碼值, str[5]則
應存放字符串終止符'/0'。
3. Turbo C2.0對數組不作邊界檢查。例如用下面語句說明兩個數組
char str1[5], str2[6];
當賦給str1一個字符串"ABCDEFG"時, 只有"ABCDE"被賦給, "E" 將會自動的賦給str2, 這點應特別注意。
三、多維數組
多維數組的一般說明格式是:
類型 數組名[第n維長度][第n-1維長度]......[第1維長度];
這種說明方式與BASIC、FORTRAN等語言中多維數組的說明不一樣。
例如:
int m[3][2]; /*定義一個整數型的二維數組*/
char c[2][2][3]; /*定義一個字符型的三維數組*/
數組m[3][2]共有3*2=6個元素, 順序爲:
m[0][0], m[0][1], m[1][0], m[1][1], m[2][0], m[2][1];
數組c[2][2][3]共有2*2*3=12個元素, 順序爲:
c[0][0][0], c[0][0][1], c[0][0][2],
c[0][1][0], c[0][1][1], c[0][1][2],
c[1][0][0], c[1][0][1], c[1][0][2],
c[1][1][0], c[1][1][1], c[1][1][2],
數組佔用的內存空間(即字節數)的計算式爲:
字節數=第1維長度*第2維長度*...*第n維長度*該數組數據類型佔用的字節數
4.5 變量的初始化和賦值
一、變量的初始化
變量的初始化是指變量在被說明的同時賦給一個初值。Turbo C2.0中外部變量和靜態全程變量在程序開始處被初始化, 局部變量包括靜態局部變量是在進入定義它們的函數或複合語句時才作初始化。所有全程變量在沒有明確的初始化時將被自動清零, 而局部變量和寄存器變量在未賦值前其值是不確定的。
對於外部變量和靜態變量, 初值必須是常數表達式, 而自動變量和寄存器變量可以是任意的表達式, 這個表達式可以包括常數和前面說明過的變量和函數。
1. 單個變量的初始化
例如:
float f0, f1=0.2;/*定義全程變量, 在初始化時f0被清零, f1被賦0.2*/
main()
{
static int i=10, j; /*定義靜態局部變量, 初始化時i被賦10, j不確
定*/
int k=i*5; /*定義局部變量, 初始化時k被賦10*5=50*/
char c='y'; /*定義字符型指什變量並初始化*/
.
.
.
}