C語言基礎知識重點和難點

2021-03-03 23:06:55 字數 4268 閱讀 7892

1) 不能在方括號中用變數來表示元素的個數,但是可以是符號常數或常量表示式。

例如: #define fd 5

main()

是合法的。

但是下述說明方式是錯誤的。

main()

int n=5;

int a[n];

}2) c語言對陣列的初始化賦值還有以下幾點規定:

(1) 可以只給部分元素賦初值。

當中值的個數少於元素個數時,只給前面部分元素賦值。

例如: int a[10]=;

表示只給a[0]~a[4]5個元素賦值,而後5個元素自動賦0值。

(2)只能給元素逐個賦值,不能給陣列整體賦值。

例如給十個元素全部賦1值,只能寫為:

int a[10]=;

而不能寫為:

int a[10]=1;

(3)如給全部元素賦值,則在陣列說明中,可以不給出陣列元素的個數。

例如: int a[5]=;

可寫為:

int a=;

1) 在c語言中只能逐個地使用下標變數,而不能一次引用整個陣列。

例如,輸出有10個元素的陣列必須使用迴圈語句逐個輸出各下標變數:

for(i=0; i<10; i++)

printf("%d",a[i]);

而不能用乙個語句輸出整個陣列。

下面的寫法是錯誤的:

printf("%d",a);

2) 引用陣列元素時一定注意下標不能越界

例如,int i=4, n=;,

則可以引用n[0],n[4],n[!5],n[i++],但不能引用n[5], n[++i]

例1:若有定義語句:int m[ ]=,i=4; ,則下面對m陣列元素的引用中錯誤的是___c___。

a、m[--i]

b、m[2*2]

c、m[m[0]]

d、m[m[i]]

1) 查詢指定的元素,返回其下標。比如,要求查詢數值5是否陣列中

2) 查詢陣列的最大(最小)值,並返回最大(最小)值及其對應的下標

3) 陣列的排序(公升序或降序),包括氣泡排序和選擇排序兩種演算法

4) 在有序陣列中插入乙個元素,使得陣列仍然有序

5) 陣列的逆序

6) 在陣列中刪除滿足某條件的元素

二維陣列初始化也是在型別說明時給各下標變數賦以初值。二維陣列可按行分段賦值,也可按行連續賦值。

例如對陣列a[5][3]:

1) 按行分段賦值可寫為:

int a[5][3]=,,,, };

2) 按行連續賦值可寫為:

int a[5][3]=;

對於二維陣列初始化賦值還有以下說明:

1) 可以只對部分元素賦初值,未賦初值的元素自動取0值。

例如:int a[3][3]=,,};

是對每一行的第一列元素賦值,未賦值的元素取0值。 賦值後各元素的值為:

1 0 0

2 0 0

3 0 0

int a [3][3]=,,};

賦值後的元素值為:

0 1 0

0 0 2

3 0 0

2) 如對全部元素賦初值,則第一維的長度可以不給出。

例如:int a[3][3]=;

可以寫為:

int a[3]=;

例1:以下不能正確定義二維陣列的選項是___d___。

a、int a[2][2]=,};

b、int a[2]=;

c、int a[2][2]=,2,3}

d、int a[2]=,}

和一維陣列一樣,一定要注意下標不越界。

例1:若有定義

int  a[2][3];

以下選項中對a陣列元素正確引用的是___d___

a)a[2][!1]    b)a[2][3]

c)a[0][3]    d)a[1>2][!1]

1) 字元陣列也允許在定義時作初始化賦值。

例如: char c[10]=;

賦值後各元素的值為:

陣列c c[0]的值為『c』

c[1]的值為『 』

c[2]的值為『p』

c[3]的值為『r』

c[4]的值為『0』

c[5]的值為『g』

c[6]的值為『r』

c[7]的值為『a』

c[8]的值為『m』

其中c[9]未賦值,由的值為『p』系統自動賦予0值。

當對全體元素賦初值時也可以省去長度說明。

例如: char c=;

這時c陣列的長度自動定為9。

在c語言中沒有專門的字串變數,通常用乙個字元陣列來存放乙個字串。前面介紹字串常量時,已說明字串總是以'\0'作為串的結束符。因此當把乙個字串存入乙個陣列時,也把結束符'\0'存入陣列,並以此作為該字串是否結束的標誌。

有了'\0'標誌後,就不必再用字元陣列的長度來判斷字串的長度了。

2) c語言允許用字串的方式對陣列作初始化賦值。

例如: char c=;

可寫為:

char c=;

或去掉{}寫為:

char c="c program";

用字串方式賦值比用字元逐個賦值要多佔乙個位元組, 用於存放字串結束標誌'\0'。上面的陣列c在記憶體中的實際存放情況為:

『\0'是由c編譯系統自動加上的。由於採用了『\0'標誌,所以在用字串賦初值時一般無須指定陣列的長度, 而由系統自行處理。

用於輸入輸出的字串函式,在使用前應包含標頭檔案"stdio.h",使用其它字串函式則應包含標頭檔案"string.h"。

1) 輸出函式 puts

2) 輸入函式gets:gets讀入字串時,可以讀入其中的空格,直到回車。而用scanf讀入字串時,遇到空格即停止。

3) 連線函式strcat:格式為strcat (字元陣列名1,字元陣列名2),一定注意,字元陣列1一定要足夠大,否則將越界。

4) 拷貝函式strcpy:格式為strcpy (字元陣列名1,字元陣列名2)。注意,字元陣列賦值,不能用等於號,而要用strcpy函式

5) 比較函式strcmp:格式為strcmp(字元陣列名1,字元陣列名2)。注意,字元陣列的比較不能用大於、小於號比較。

測字串長度函式strlen:測字串的實際長度(不含字串結束標誌『\0』) 並作為函式返回值。

函式的形參和實參具有以下特點:

1) 形參變數只有在被呼叫時才分配記憶體單元,在呼叫結束時,即刻釋放所分配的記憶體單元。因此,形參只有在函式內部有效。函式呼叫結束返回主調函式後則不能再使用該形參變數。

2) 實參可以是常量、變數、表示式、函式等,無論實參是何種型別的量,在進行函式呼叫時,它們都必須具有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使實參獲得確定值。

3) 實參和形參在數量上,型別上,順序上應嚴格一致,否則會發生型別不匹配」的錯誤。

4) 函式呼叫中發生的資料傳送是單向的。即只能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。因此在函式呼叫過程中,形參的值發生改變,而實參中的值不會變化。

下例可以說明這個問題。

int s(int n)

main()

1) 陣列元素作函式實參

陣列元素就是下標變數,它與普通變數並無區別。 因此它作為函式實參使用與普通變數是完全相同的,在發生函式呼叫時,把作為實參的陣列元素的值傳送給形參,實現單向的值傳送。

2) 陣列名作為函式引數

陣列名作函式引數時所進行的傳送只是位址的傳送,也就是說把實參陣列的首位址賦予形參陣列名。形參陣列名取得該首位址之後,也就等於有了實在的陣列。實際上是形引數組和實參陣列為同一陣列,共同擁有一段記憶體空間。

上圖說明了這種情形。圖中設a為實參陣列,型別為整型。a占有以2000為首位址的一塊記憶體區。

b為形參陣列名。當發生函式呼叫時,進行位址傳送,把實參陣列a的首位址傳送給形參陣列名b,於是b也取得該位址2000。於是a,b兩陣列共同占有以2000為首位址的一段連續記憶體單元。

從圖中還可以看出a和b下標相同的元素實際上也佔相同的兩個記憶體單元(整型陣列每個元素佔二位元組)。例如a[0]和b[0]都占用2000和2001單元,當然a[0]等於b[0]。類推則有a[i]等於b[i]。

例1:判別乙個整數陣列中各元素的值,若大於0 則輸出該值,若小於等於0則輸出0值。程式設計如下:

void nzp(int a[5])

{ int i;

printf("\nvalues of array aare:\n");

for(i=0;i<5;i++)

{if(a[i]<0)a[i]=0;

printf("%d ",a[i]);

c語言基礎知識

c語言的源程式 用c這種高階語言所編寫的 是乙個不可以執行的檔案,其字尾名為.c,經過編譯程式編譯後將生成為乙個不可以執行的二進位制檔案,其字尾名為.obj,再經過連線程式連線後將生成為乙個可以執行的二進位制檔案,其字尾名.exe 演算法 c語言是一種結構化的程式語言在c語言中提供了三種基本結構 順...

C語言基礎知識

10 b c 不是c語言提供的合法關鍵字。a switchb printc case d default 11 c語言提供的合法關鍵字是 a a breakb printc funiton d end 12 c語言提供的合法關鍵字是 a a continue b procedure c begin ...

c語言基礎知識總結

c語言知識要點複習資料 總體上必須清楚的 1 程式結構是三種 順序結構 選擇結構 分支結構 迴圈結構。2 讀程式都要從main 入口,然後從最上面順序往下讀 碰到迴圈做迴圈,碰到選擇做選擇 有且只有乙個main函式。3 計算機的資料在電腦中儲存是以二進位制的形式.資料存放的位置就是他的位址.4 bi...