1. 程式人生 > >C&C++關於陣列的定義,引用傳參問題

C&C++關於陣列的定義,引用傳參問題

        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;}