作為函式引數的陣列名

2021-05-27 04:34:27 字數 1809 閱讀 2580

當乙個陣列名作為引數傳遞給乙個函式時會發生什麼情況呢?

已知:陣列名的值 == 指向陣列第乙個元素的指標。

此時,傳遞給函式的,是乙份該指標的copy(這裡注意,後面講解)。函式如果執行了下標引用,實際上是對這個指標執行了間接訪問操作,並且通過這種這種間接訪問,函式可以訪問和修改呼叫程式的陣列元素。

說明:所有傳遞給函式的引數都是通過「傳值」方式進行的,但是陣列名引數的行為卻彷彿是通過「傳址」呼叫傳遞的。

「傳址」呼叫是通過傳遞乙個指向所需元素的指標,然後在函式中隊該指標執行間接訪問操作實現對資料的訪問。

其實,作為函式引數的陣列名,傳遞的只是引數的乙份copy,也是「傳值」的方式。所以,函式引數的陣列名可以進行自由的操作,而不會修改對應的作為實參的指標。

這裡說明一點,作為陣列名 == 乙個指標常量。(是不允許修改的。呵呵)

問題:如果你想把乙個陣列名引數傳遞給函式,正確的函式形式應該是怎樣的?

他是應該宣告為乙個個指標還是乙個陣列?

我們現在知道,呼叫函式時實際傳遞的是乙個指標,所以函式的形參實際上是個指標。但為了使程式設計師新手更容易上手一些,編譯器也接受陣列形式函式引數,因此,下面兩個函式原型是相等的:

int str(char *string);

int str(char string);

這個相等性暗示指標和陣列名實際上是相等的,也就是說對於陣列形參,你可以使用任何一種形式的宣告。

你可以使用任何一種宣告,但這兩種宣告更精確?答案是:指標。因為實參實際上是個指標,而不是陣列。同樣,表示式:

sizeof(string)的值是指向字元的指標的長度,而不是陣列的長度。

現在,我們清楚了為什麼函式原型中的一維陣列形參無需寫明他的元素數目,因為函式並不為陣列引數分配記憶體空間。形參值是乙個指標,他指向的是已經在其他地方分配好記憶體的空間。

另外,這種方式使函式無法知道陣列的長度。如果函式需要知道陣列的長度,他必須作為乙個顯式的引數傳遞給函式。

多維陣列:一樣,實際傳遞的是個指向陣列第乙個元素的指標。但是,和一維的區別,多維陣列的每個元素本身是另外乙個陣列,編譯器需要知道他的維數,以便為函式形參的下標表示式進行求值。

例子:int vector[10];

func_1(vector);

引數vector的型別是指向整型的指標,所以func_1的原型,可以是下面2種中任何一種:

void func_1(int *vec);

void func_1(int vec);

作用於vec上面的指標運算把整型的長度作為他的調整因子。

現在看乙個矩陣:

int  matrix[3][10];

func_2(matrix);

這裡,引數matrix的型別是指向包含10個整型元素的陣列指標。func_2的原型是怎樣的呢?你可以使用下面兩種形式的任何一種:

void func_2(int (*mat)[10]);

void func_2(int mat[10]);

在這個函式中,mat的第1個下標根據包含10個元素的整型陣列的長度進行調整,接著第2個下標根據整形的長度進行調整,這和原先的matrix陣列一樣。

關鍵:在於編譯器必須知道第2個及以後各維德長度才能對下標進行求值,因此在原型中必須宣告這些維德長度。第1維德長度並不需要,因為在計算下標值時用不到他。

注意:在編寫一維陣列形參的函式原型時,既可以用陣列形式,也可以把他寫成指標形式。但是,多維陣列,只有第1維可以進行如此選擇。尤其是,把func_2寫成下面的原型是錯誤的:

void func_2(int **mat);

這個例子,把mat宣告為乙個指向整型指標的指標,他和指向整型陣列的指標並不是一回事。

就到這裡,休息一下。呵呵

陣列名做函式引數

陣列名做函式引數 用陣列名做函式引數與用陣列元素作實參有幾點不同 1 用陣列元素作實參時,只要陣列型別和函式的形參變數的型別一致,那麼作為下標變數的陣列元素的型別也和函式形參變數的型別是一致的。因此,並不要求函式的形參也是下標變數。換句話說,對陣列元素的處理是按普通變數對待的。用陣列名作函式引數時,...

使用陣列名作為函式引數

主函式中初始化乙個二維陣列,表示乙個矩陣,矩陣,並將每個元素都輸出,然後呼叫子 函式,分別計算每一行的元素之和,將和直接存放在每行的第乙個元素中,返回主函式之 後輸出各行元素的和。include using namespace std void rowsum int a 4 int nrow int...

二維陣列名如何作為引數傳遞

在用二維陣列名作為引數傳遞時容易出現segmention error。這是因為不能正確為二維陣列中元素定址的問題,正確的方法如下 cpp view plain copy include include define n 4 void testarray int a,intm,intn intmain...