乙個c函式可以把陣列作為形參,在c++具體表現形式有三種:
void func(int para);
void func(int para[20]);
void func(int *para);
這三種形式雖然表現不同,在c++中都看成相同的,等價於void func(int *para)。在傳遞實參時,陣列名被隱式轉換成指向陣列第乙個元素的指標,因此傳入的引數實際為指向陣列第乙個元素的指標。
傳入陣列時,陣列的元素個數資訊丟失。c++中的陣列名並不等價於指標,陣列名是乙個特殊的型別,其中記錄了陣列首元素指標和元素個數。這就是為什麼陣列名也可以像迭代器一樣使用end()函式。一旦陣列傳入函式,函式內部就把para作為乙個指標,不能使用end()函式。具體到linux上觀察程式運**況:
陣列cs的儲存,首先取堆疊位址賦給rsi暫存器,清零eax,然後的mov $0x14,%edx標識陣列元素個數,設定rdi,rcx暫存器作為必要引數,呼叫rep stos開闢記憶體空間,其首位址是rdi暫存器的值(注意在es:rdi所指位置開闢)。最後是對陣列賦初值。執行函式呼叫時,首先取出該陣列儲存位置首位址賦給rax,再傳給rdi暫存器,下面轉入函式內部執行。那麼函式內部是如何傳遞陣列引數的呢?下面看函式內部的實現:
執行必要的保護後,mov %rdi, -0x8(%rbp)便是關鍵,原來是通過暫存器rdi傳入的引數, 且函式內部僅傳入了唯一的引數,那便是儲存在rdi中的陣列首位址。
因此函式傳入陣列引數,實際僅傳入了首位址指標。
函式內部到底可不可以把陣列作為返回值,而不使用指標。設想如下函式形式:
auto getsizeof(fds ss)->int [2]
;}編譯器如果採用前置宣告返回陣列,會出現錯誤,提示函式禁止把陣列作為返回值。而宣告為後置格式後,則不會報錯。在主程式中呼叫該函式:
int main()
}; int (&&c)[2]= getsizeof(cs);
cout<
此處左值需要使用&。然後把函式呼叫句改為:
int (&c)[2]= getsizeof(cs);
編譯出現錯誤:main.cpp|18|error: invalid initialization of non-const reference of type 'int (&)[2]' from an rvalue of type 'int [2]'|
此時函式返回變為右值了。那麼到底是左值還是右值,還是根本就沒有傳遞引數。
此時比較矛盾的是返回值型別,如果表示為int [2],表示的型別並非完整的陣列,也並非陣列首位址指標,而是一種不完整的型別。函式返回時僅對陣列首位址進行傳遞,陣列名內部存放了一些關鍵資訊,例如元素個數,此時卻沒有傳出,因此返回值int [2]是不完整的,也是不合法的。當對這種錯誤格式進行操作時,就會產生錯誤。
因此再次指出,不可以將陣列直接作為函式返回值。如果需要,可以使用陣列指標,函式格式改為:
auto getsizeof(fds ss)->int *[2]
C 中函式傳遞陣列的問題
本人目前在自學c 在學習結構體時碰到了乙個小問題,先來看問題 案例描述 設計乙個英雄的結構體,包括成員姓名,年齡,性別 建立結構體陣列,陣列中存放5名英雄。通過氣泡排序的演算法,將陣列中的英雄按照年齡進行公升序排序,最終列印排序後的結果。五名英雄資訊如下 下面是我第一次寫的 我在sort hero函...
C 陣列在函式中的傳遞與返回
陣列在函式中做形參宣告時可以有兩種形式 陣列 指標,舉例如下 void sum int arr,int len void sum int arr,int len 當且僅當用於函式頭或函式原型中,int arr和int arr的含義才是相同的,他們都意味著arr是乙個int指標。然而,陣列表示法 in...
c 中如何給函式傳遞陣列引數
在c 中,如果要給乙個函式傳入乙個陣列,一般都是傳入兩個引數乙個陣列指標和乙個陣列大小 例 void print 1 int n,int datas std cout std endl 對這個函式,我們可以這樣使用它 const int n 3 int datas n print 1 n,datas...