#define maxSize 50
正確定義方法:int array[maxSize];
錯誤定義方法:int array[length];
分析:數組的 [ ]中只能放入常量,maxSize是宏定義的常量,而length是定義的靜態變量,所以用後一種方法定義就會抱錯;我們一般定義的時候使用maxSize申請足夠大的空間,但是賦值的時候使用length來賦值,也就是說不是所有申請的maxSize的空間都會在一開始被賦值。之所以這樣,是爲了方便以後的數組順序表元素的刪減和增加操作;比如刪除最後一個元素,只需要 ”length--;“就可以了。
(2)數組的傳參及引用問題
如果前面定義好了int型的數組 array[maxSize],int型變量min和max,需要用函數search()來找出數組的最大值和最小值,傳參的情況如下
實參: 正確傳參 search(array,max,min);
錯誤傳參1 search(array[ ],max,min);
錯誤傳參2 search(array[maxSize],max,min);
錯誤傳參3 search(array,&max,&min);
形參: 正確傳參1 void search(int *array,&max,&min){ }
正確傳參2 void search(int array[ ],&max,&min){ }
錯誤傳參1 void search(int array[maxSize],max,min){ }
分析:實參的參數本身已經帶有數據類型,可以直接傳參,而形參則必須在傳參的同時生命參數的類型。傳參的時候注意,實參對應位置和形參對應位置的數據類型必須保持一致。
對於實參,search()函數第一個參數位置應該放入int *類型的變量array,即數組的首地址指針,不能放入array[ ]。而array[maxSize]的類型並不是int *,而是int型的變量array[50] (前面有宏定義的語句 #define maxSize 50),而且array[50]並沒有被賦值,所以用array[50]傳參就會報錯,因此錯誤1 2 是因爲第一個參數的類型不對;對於錯誤3,&max和 &min的類型都爲int*型的整形指針,而形參需要的是int型的變量,所以類型不對就會抱錯。千萬不能以爲&max表示max類型的引用,引用符號&只能對形參使用!引用符號&只能對形參使用!引用符號&只能對形參使用!(重要的事情說三遍),如果對實參使用,則表示取地址,因此實參的類型就會變成指針類型;
對於形參,第一個位置穿進來的爲指針類型,因此可以用指針類型直接定義,爲正確傳參1的形式,也可以寫成正確傳參2形式的,但是這種形式(int array[ ])只能對形參使用,即只有形參定義的時候可以省略數組的長度!只有形參定義的時候可以省略數組的長度!只有形參定義的時候可以省略數組的長度!同樣,如果是二維數組,省略形式爲(int array[][maxSize]),也即是說第二個下表不能省略,只能省略第一個下標。對於錯誤傳參1,沒有&引用的後果就是被調用函數search( )執行完以後調用函數裏面max和min的值不變!這樣基礎的錯誤自然不必多說。
示例代碼如下:
/* 線性表課後題3 以不多於3n/2的平均比較次數,找出n個整數的順序表A中的最大值和最小值