將陣列作為實參傳遞

2021-08-24 21:43:10 字數 1224 閱讀 5759

在c++中我們應該少用指標,多用引用,原因請大家自行搜尋。在傳遞陣列的時候我們需要格外注意,先讓我們看乙個簡單的範例。

// passarray.cpp : 定義控制台應用程式的入口點。

//#include

"stdafx.h"

#include

using namespace std;

template

void func1(t, t);

template

void func2(t&, t&);

void func3(int (&)[10], int (&)[12]);

int _tmain(int argc, _tchar* argv)

template

void func1(t, t)

{ cout<

void func2(t&, t&)

{ cout<

{ cout<

首先這個範例無法編譯通過:

error c2782: 'void __cdecl func2(t &,t &)' : template parameter 't' is ambiguous

could be 'int [12]'

or 'int [10]'

原因就出在型別推斷上。根據定義,func2的型別必須是t&,也就是說傳遞實參的時候,兩個形參必須是相同的,而這一點在模板程式設計中就會由編譯器來負責推斷。

func1:

呼叫func1(a, b)則推斷的型別分別是func1(int*, int*),呼叫函式將會自動將陣列的首位址指標作為實參進行傳遞,因此型別推斷兩形參相同,編譯通過!

func2:

呼叫func2(a, b)因為我們希望按引用的方式進行實參傳遞,因此需要遵循這樣的規律:

(p208)如果形參是陣列的引用,編譯器將不會將陣列實參轉化為指標,而是傳遞陣列引用的本身。在這種情況下,陣列大小成為形參和實參型別的一部分。

所以推斷型別分別是func2(int (&)[10], int (&)[12]),因為int (&)[10] != int (&)[12],所以與t == t相悖!自然也就編譯不過了!

func3:

該函式是func2的乙個靜態表示,通過上面的解釋應該很容易理解這個**了。

另:形參用字元指標,而實參是字元陣列,這時候會發生什麼?待解。

陣列作為函式實參

陣列作為函式實參 c語言中陣列作為函式實參時,編譯器總是將其解析為指向陣列首元素位址的指標 位址呼叫 原因 我們知道c 語言函式的呼叫有傳值和傳位址呼叫。假設 c語言對陣列採用傳值呼叫 對實參作乙份拷貝,傳遞給被呼叫函式,函式不能修改實際實參值,而只能改變其拷貝 然後如果拷貝整個陣列,則在時間和空間...

「陣列作為實參」的情況

陣列型別為const 指標,且附帶元素的型別和陣列長度資訊,僅當陣列元素的型別和陣列長度均相同時,兩個陣列型別才相同。比如,有 int a 16 b 15 a,b不是同乙個型別,因為陣列的長度不同。當實參為陣列型別時,比如有 int a 16 以a 作為實參,如果形參是非引用型別,比如 int pa...

4 5 將函式作為值傳遞

在go 語言中,函式也是值 可被賦值 傳參或返回,這是函式式程式設計的基礎 1.函式內部的函式 必須為匿名函式 func foo i int 注 在需要使用時,可以通過bar來呼叫,bar 2.向函式傳遞函式,將其賦予乙個有名引數變數 func foo bar func int 3.從函式返回函式 ...