#如何使用陣列引數?
如果乙個函式以一維陣列為引數,我們可以這樣宣告這個函式
void func(int* a) ;實際上,這三種形式是等價的,在使用陣列做引數時,編譯器會自動將陣列名轉換為指向陣列第乙個元素的指標,為什麼呢?這要從引數的傳遞方式說起,引數有三種傳遞方式,按值傳遞,按指標傳遞,按引用傳遞,分別如下void func(int a) ;
void func(int a[3]) ;
void test(int a) ;第一種方式傳遞的是a的乙個副本void test(int* a) ;
void test(int& a) ;
第二種方式傳遞的是指向a的指標的乙個副本
第三種方式傳遞的是指向a的引用的乙個副本
既然都是副本,那麼就存在拷貝到過程,但是,陣列是不能直接拷貝的,也就是不能像下面這樣
int a[3] = ;不能用乙個陣列初始化另乙個陣列,也不能將乙個陣列直接賦值給另外乙個陣列,如果想複製陣列,唯一的辦法就是逐個元素複製。int b ; // 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個元素的陣列}
the end
如何使用陣列引數
如果乙個函式以一維陣列為引數,我們可以這樣宣告這個函式 void func int a void func int a void func int a 3 實際上,這三種形式是等價的,在使用陣列做引數時,編譯器會自動將陣列名轉換為指向陣列第乙個元素的指標,為什麼呢?這要從引數的傳遞方式說起,引數有三...
如何使用陣列引數
如果乙個函式以一維陣列為引數,我們可以這樣宣告這個函式 void func int a void func int a void func int a 3 實際上,這三種形式是等價的,在使用陣列做引數時,編譯器會自動將陣列名轉換為指向陣列第乙個元素的指標,為什麼呢?這要從引數的傳遞方式說起,引數有三...
如何使用陣列引數
如果乙個函式以一維陣列為引數,我們可以這樣宣告這個函式 void func int a void func int a void func int a 3 實際上,這三種形式是等價的,在使用陣列做引數時,編譯器會自動將陣列名轉換為指向陣列第乙個元素的指標,為什麼呢?這要從引數的傳遞方式說起,引數有三...