陣列作為函式實參:
c語言中陣列作為函式實參時,編譯器總是將其解析為指向陣列首元素位址的指標
(位址呼叫
)原因:我們知道c
語言函式的呼叫有傳值和傳位址呼叫。假設
c語言對陣列採用傳值呼叫
(對實參作乙份拷貝,傳遞給被呼叫函式,函式不能修改實際實參值,而只能改變其拷貝
),然後如果拷貝整個陣列,則在時間和空間上開銷都非常大。而對於函式,只要知道實參陣列的首元素的位址,照樣可以訪問整個陣列,所以採用傳址呼叫效率更高。
注意的一點是對於函式來說,其接受的是陣列首元素的位址,所以它是並不知道陣列的大小的。
一維陣列作函式實參:
#include void fun(char *p)
void fun(char a[10])
void fun(char a)
void main(int argc,char* argv)
以上三個函式為一維陣列作為實參的函式常用的定義方式。三個函式輸出的結果都是4
,說明了傳給函式就是乙個位址,特別對於第二種定義,不要以為該函式只能接收大小為
10的陣列,實際實參陣列的大小與函式形引數組的大小是沒有任何關係的。最好採用第三種方式定義,因為第一種方式,我們也可以認為該函式的實參為指標,而第二種方式可能會誤認為該函式只能接收大小為
10的陣列。
二維陣列作為函式實參:
錯誤認識:既然一維陣列作為引數相當與乙個指標,那二維陣列作為引數就相當於乙個二級指標。
正確認識:二維陣列名作為引數時相當於乙個陣列指標(
指向一維陣列的指標)。
#include void fun(int a[4][3])
void fun(int (*p)[3])
void fun(int a[3])
void main(int argc,char* argv)
; fun(a);
}
以上二維陣列作為函式實參的函式常用的定義方式。函式定義中,陣列第二維的數目必須要與實參第二維的數目一樣,第一維的數目無所謂。因為二維陣列名做實參時,編譯器是將其解析為乙個指向大小為第二維的陣列的指標。
流作為函式實參
include include include include 使用setw必須 using namespace std void make neat ifstream messy file,ofstream neat file,int number after decimalpoint,int f...
將陣列作為實參傳遞
在c 中我們應該少用指標,多用引用,原因請大家自行搜尋。在傳遞陣列的時候我們需要格外注意,先讓我們看乙個簡單的範例。passarray.cpp 定義控制台應用程式的入口點。include stdafx.h include using namespace std template void func1...
「陣列作為實參」的情況
陣列型別為const 指標,且附帶元素的型別和陣列長度資訊,僅當陣列元素的型別和陣列長度均相同時,兩個陣列型別才相同。比如,有 int a 16 b 15 a,b不是同乙個型別,因為陣列的長度不同。當實參為陣列型別時,比如有 int a 16 以a 作為實參,如果形參是非引用型別,比如 int pa...