使用陣列作為引數傳遞

2021-07-28 08:08:43 字數 1761 閱讀 9192

如果乙個函式以一維陣列為引數,我們可以這樣宣告這個函式

void

func(int

* a) ;

void

func(int

a) ;

void

func(int

a[3]) ;

實際上,這三種形式是等價的,在使用陣列做引數時,編譯器會自動將陣列名轉換為指向陣列第乙個元素的指標,為什麼呢?這要從引數的傳遞方式說起,引數有三種傳遞方式,按值傳遞,按指標傳遞,按引用傳遞,分別如下

void

test(int

a) ;

void

test(int

* a) ;

void

test(int

& a) ;

第一種方式傳遞的是a的乙個副本

第二種方式傳遞的是指向a的指標的乙個副本

第三種方式傳遞的是指向a的引用的乙個副本

既然都是副本,那麼就存在拷貝到過程,但是,陣列是不能直接拷貝的,也就是不能像下面這樣

int

a[3] = ;

int

b(a) ; // error

int

b[3] ;

b = a ;            // error

不能用乙個陣列初始化另乙個陣列,也不能將乙個陣列直接賦值給另外乙個陣列,如果想複製陣列,唯一的辦法就是逐個元素複製。
int

a[3] = ;

int

b[3] ;

for

(int

i = 0; i < 3; ++i)

既然陣列不能拷貝,那麼引數該如何傳遞呢?於是編譯器就將陣列名轉換成了指向第乙個元素的指標,指標是可以拷貝的。但是這也引發了另外乙個問題。我們無法只通過陣列名得知陣列元素的個數。看下面的**

void

test(int

a[3])

}

明明只傳遞了三個元素的陣列,為什麼輸出5個元素?前面已經說了,陣列被轉換成了指向第乙個元素的指標,所以上面的**和下面的相同

void

test(int

* a) //我只知道a是個指標,跟本不知道a指向多少個元素

}

編譯器根本不知奧陣列a有多少個元素,它甚至不知道a是陣列!如何解決呢,一種辦法是再加乙個引數,指定元素個數

void

test(int

* a, int

n)

}
void

test(int

(&a)[3])

}

這樣寫陣列a就不會被轉換為指標了,而且有了元素個數的資訊,呼叫的時候,也必須傳遞乙個含有3個元素的陣列

int

a[3] = ;

test(a) ;    // ok

int

b[1] = ;

test(b) ;    // error, can not convert parameter a from int[1] to int(&)[3]

陣列作為函式引數傳遞

陣列有兩個特殊的性質。一是不能複製陣列 二是使用陣列名字時,陣列會自動轉化為指向其第乙個元素的指標。由於陣列不能複製,所以無法編寫使用陣列型別形參的函式,因為陣列會被自動轉化為指標。一 一維陣列 1.三種定義形式 void printvalues int void printvalues int v...

陣列作為函式引數傳遞

重點 在c中,陣列是不能作為引數進行傳遞的,但是可以通過傳遞指向陣列初始元素的指標,使得在函式內部運算元組成為可能。在函式這一側,可以通過array i 引用陣列的內容。why?本質上array i 不過是 array i 的語法糖。include void func int array,int s...

C C 語言陣列作為引數傳遞

include include include define line 2 define row 4 int array char szstr row int len return 0 int main char szstr 4 寫乙個指標,將陣列中的元素賦值給它 int i for i 0 i 4...