|
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''; /*定義字符型指什變量并初始化*/ . . . }
2. 數組變量的初始化 例如: main() { int p[2][3]={{2, -9, 0}, {8, 2, -5}}; /*定義數組p并初始化 */ int m[2][4]={{27, -5, 19, 3}, {1, 8, -14, -2}};/*定義數組m并初始化*/ char *f[]={''A'', ''B'', ''C''}; /*定義數組f并初始化*/ . . . } 從上例可以看出: Turbo C2.0中數組進行初始化有下述規則: (1) 數組的每一行初始化賦值用"{}"并用","分開, 總的再加一對"{}"括起來,最后以";"表示結束。 (2) 多維數組的存儲是按最右維數的變量變化最快的原則。 (3) 多維數組存儲是連續的, 因此可以用一維數組初始化的辦法來初始化多維數組。 例如: int x[2][3]={1, 2, 3, 4, 5, 6};/*用一維數組來初始化二維數組*/ (4) 對數組初始化時, 如果初值表中的數據個數比數組元素少, 則不足的數組元素用0來填補。 (5) 對指針型變量數組可以不規定維數, 在初始化賦值時, 數組維數從0 開始被連續賦值。 例如: char *f[]={''a'', ''b'', ''c''}; 初始化時將會給3個字符指針賦值, 即: *f[0]=''a'', *f[1]=''b'', *f[2]=''c''。
3. 指針型變量的初始化 例如: main() { int *i=7899; /*定義整型數指針變量并初始化*/ float *f=3.1415926; /*定義浮點數指針變量并初始化*/ char *s="Good"; /*定義字符型指針變量并初始化*/ . . . }
二、變量的賦值 變量賦值是給已說明的變量賦給一個特定值。 1. 單個變量的賦值 (1) 整型變量和浮點變量 這兩種變量采用下列格式賦值 變量名=表達式; 例如: main() { int a, m; /*定義局部整型變量a, m*/ float n; /*定義局部浮點變量f*/ a=100, m=20; /*給變量賦值*/ n=a*m*0.1; . . . }
說明: Turbo C2.0中允許給多個變量賦同一值時可用連等的方式。 例如: main() { int a, b, c; a=b=c=0; /*同時給a,b,c賦值*/ . . . }
(2) 字符型變量 字符型變量可以用三種方法賦值。 例如: main() { char a0, a1, a2; /*定義局部字符型變量a0, a1, a2*/ a0=''b''; /*將字母b賦給a0*/ a1=50; /*將數字2(十進制ASCII值為50賦給a1*/ a2=''\x0d''; /*將回車符賦給a2*/ . . . }
(3) 指針型變量 例如: main() { int *i; char *str; *i=100; str="Good"; . . . } *i表示i是一個指向整型數的指針, 即*i是一個整型變量, i是一個指向該整型變量的地址。 *str表示str是一個字符型指針, 即保留某個字符地址。在初始化時, str沒有什么特殊的值, 而在執行str="Good"時, 編譯器 先在目標文件的某處保留一個空間存放"Good\0"的字符串, 然后把這個字符串的第一個字母"G"的地址賦給str, 其中字符串結尾符 "\0"是編譯程序自動加上的。 對于指針變量的使用要特別注意。上例中兩個指針在說明前沒有初始化, 因此這兩指針為隨機地址, 在小存儲模式下使用將會 有破壞機器的危險。正確的使用辦法如下: 例如: main() { int *i; char *str; i=(int*)malloc(sizeof(int)); i=420; str=(char*)malloc(20); str="Good, Answer!"; . . . } 上例中, 函數(int*)malloc(sizeof(int))表示分配連續的sizeof(int)=2個字節的整型數存儲空間并返回其首地址。同樣 (char*)malloc(20)表示分配連續20個字節的字符存儲空間并返回首地址(有關該函數以后再詳述)。由動態內存分配函數malloc() 分配了內存空間后, 這部分內存將專供指針變量使用。 如果要使i指向三個整型數, 則用下述方法。 例如: #include<alloc.h> main() { int *a; a=(int*)malloc(3*sizeof(int)); *a=1234; *(a+1)=4567; *(a+2)=234; . . . } *i=1234表示把1234存放到i指向的地址中去, 但對于*(i+1)=4567, 如果認為將4567存放到i指向的下一個字節中就錯了。 Turbo C2.0中只要說明i為整型指針, 則 (i+1) 等價于 i+1*sizeof(int) 同樣 (i+2) 等價于 i+2*sizeof(int)
2. 數組變量的賦值 (1) 整型數組和浮點數組的賦值 例如: main() { int m[2][2]; float n[3]; m[0][0]=0, m[0][1]=17, m[1][0]=21;/*數組元素賦值*/ n[0]=109.5, n[1]=-8.29, n[2]=0.7; . . . }
(2)字符串數組的賦值 例如: main() { char s[30]; strcpy(s, "Good News!"); /*給數組賦字符串*/ . . . } 上面程序在編譯時, 遇到char s[30]這條語句時, 編譯程序會在內存的某處留出連續30個字節的區域, 并將第一個字節的地 址賦給s。當遇到strcpy( strcpy 為Turbo C2.0的函數)時, 首先在目標文件的某處建立一個"Good News!\0" 的字符串。 其中\0表示字符串終止, 終止符是編譯時自動加上的,然后一個字符一個字符地復制到s所指的內存區域。因此定義字符串數組時, 其元素個數至少應該比字符串的長度多1。 注意: 1. 字符串數組不能用"="直接賦值, 即s="Good News!"是不合法的。所以應分清字符串數組和字符串指針的不同賦值方法。 2. 對于長字符串, Turbo C2.0允許使用下述方法: 例如: main() { char s[100]; strcpy(s, "The writer would like to thank you for" "your interest in his book. He hopes you" "can get some helps from the book."); . . . }
(3)指針數組賦值 例如: main() { char *f[2]; int *a[2]; f[0]="thank you"; /*給字符型數組指針變量賦值*/ f[1]="Good Morning"; *a[0]=1, *a[1]=-11; /*給整型數數組指針變量賦值*/ . . . }
三、數組與指針 數組與指針有密切的聯系。數組名本身就是該數組的指針, 反過來, 也可以把指針看成一個數組, 數組名和指針實質上都是地 址, 但是指針是變量, 可以作運算。而數組名是常量, 不能進行運算。 例如: main() { char s[30], *p; /*定義字符型數組和指針變量*/ p=s; /*指針p指向數組s的第一個元素s[0]的地址*/ . . . *(p+8); /*指針p指向數組s的第9個元素s[8]的地址*/ . . . } 由上例可以看出數組和指針有如下關系: (p+i)=&(s[i]) *(p+i)=s[i] 因此, 利用上述表達式可以對數組和指針進行互換。兩者的區別僅在于: 數組s是程序自動為它分配了所需的存儲空間; 而指針 p則是利用動態分想函數為它分配存儲空間或賦給它一個已分配的空間地址。
|