C&C++關于數組的定義,引用傳參問題(1)數組的定義 #define maxSize 50 static int length = 10; 正確定義方法: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中的最大值和最小值分析:可以利用if else 語句來減少比較次數;因為最好的情況if成立,else就不用比較所以比較次就可以減少一半 */#include <iostream>using namespace std;#define maxSize 50static int length = 10;void search(int array[], int &max, int &min){max = min = array[1];for (int i = 1; i <= length;i++){if (array[i] > max)max=array[i];else if (array[i] < min)min = array[i];}}int main( ){int array[maxSize];for (int i = 1,j=length; i <= length; i++,j--){ cout <<j<<": "; cin >> array[i]; }for (int i = 1; i <= length; i++){ cout << array[i] << " "; }int max = 0;int min = max;search(array,max,min);cout << "max" << max << " min " << min << endl;return 0;}