c 引數傳遞

2021-10-02 15:07:06 字數 3482 閱讀 8851

引數傳遞:

形參(parameter)和實參(argument):

int num (

int a,

int b)

;int num (

int a,

int b)

//在函式的宣告或者定義裡,由由0個或多個形參組成的列表。

intmain()

形參的型別決定了形參實參互動的方式,如形參是引用型別,他將繫結到對應的實參上,引用形參是它對應實參的別名。否則,將實參的值拷貝後賦給形參。

當形參是引用型別,我們說,它對應的實參被引用傳遞(passed by reference)或者函式被傳引用呼叫(called by reference)。

當實參的值被拷貝給形參時,我們說,這樣的實參被值傳遞(passed by value)或者函式被傳值呼叫(called by value)。

傳值引數:

初始化乙個非引用型別變數,初始值被拷貝給變數,對變數的改動不會影響初始值。

int n =0;

int i = n;

i =1

;cout << n;

//輸出0,i的值改變,n的值不變。

指標形參:指標的行為和其他非引用型別一樣,當執行指標拷貝操作,拷貝的是指標的值。拷貝之後,兩個指標是不同的指標。因為通過指標,我們可以間接訪問它所指物件,所以通過指標可以修改它所指物件的值。

void

reset

(int

*ip)

int i =1;

reset

(&i)

;//改變i的值而非i的位址

cout <<

"i = "

<< i

——————————————————————————————————————

//實參類似於下面:(q)

int i =1;

int*q =

&i;//形參類似於下面:(p)

int n =0;

int*p =

&n;//實參呼叫形參類似與下面:

p = q;

//p指向了i

*p =2;

//通過p改變了i,但是此時q並未改變。

傳引用引數:

對於引用的操作,實際上是作用在引用所引的物件上。通過引用形參,允許函式改變乙個或多個實參的值。

void reset (

int&i)

int j=1;

reset

(j);

//j採用傳引用方式,因此他的值被改變。

cout

傳引用引數:當形參是頂層const時,傳給他常量物件或者非常量物件都是可以的。

const

int ci =1;

int i = ci;

//正確,當拷貝ci時,忽略了它的頂層const。

int*

const p =

&i;//const是頂層的,不能給p賦值。

*p =0;

//正確,通過p改變物件內容是允許的。

//在c++中,允許定義若干具有相同名字的函式,不過前提是不同函式的形參列表應該具有明顯區別。

void

fcn(

const

int i)

//呼叫fcn函式時,既可以傳入const int也可以傳入int。

void

fcn(

int i)

//此時再寫乙個函式定義,會報錯誤,因為重複定義了fcn(int)。

傳引用引數:我們可以用非常量初始化乙個底層const物件,但無法用乙個底層const物件初始化乙個非常量。如果形參是乙個非常量,那麼實參不能是乙個底層const物件

int i =1;

const

int*cp =

&i;//正確,但是cp不能改變i

const

int&r = i;

//正確,但是r不能改變i

const

int&r2 =1;

//正確

int*p = cp;

//錯誤,p型別和cp型別不匹配

int&r3 = r;

//錯誤,r3型別和r型別不匹配

int&r4 =1;

//錯誤,不能用字面值初始化乙個非常量引用

同樣的初始化規則應用到引數傳遞上:

void

reset

(int

*ip)

void

reset

(int

&i) string:

:size_type find_char

(const string &s,

char c,string:

:size_type &occurs)

int i =0;

const

int ci = i;

string:

:size_type ctr =0;

reset

(&i)

;//正確,呼叫形參型別是int*的reset函式。

reset

(&ci)

;//錯誤,不能用指向const int物件的指標初始化int*。

reset

(i);

//正確,呼叫形參型別是int&的reset函式。

reset

(ci)

;//錯誤,不能把普通引用繫結到const物件ci上。

reset(42

);//錯誤,不能把普通引用繫結到字面值上。

reset

(ctr)

;//錯誤,型別不匹配

find_char

("hello world!"

,'o'

,ctr)

;//正確,find_char第乙個形參是對常量的引用。

盡量使用常量引用:

把函式不會改變的形參定義成普通的引用會給函式呼叫者一種誤導,即函式可以修改它實參的值。此外,使用引用而非常量引用也會極大限制函式所能接受實參型別。不能把const物件、字面值、或者需要型別轉換的物件傳遞給普通的引用形參。

string:

:size_type find_char

(string &s,

char c,string:

:size_type &occurs)

find_char

("hello world!"

,'o'

,ctr)

;//編譯時發生錯誤,因為不能把普通引用繫結到const物件上。應該把string &s修改為const string &s

bool is_sentence

(const string &s)

c 引數傳遞

引數型別分為int,ref,out三種,預設為int.int型別在字方法中修改了對應變數後,主方法中的值不會發生變化.ref型別在方法中修改了對應變化後,主方法中的值也會發生變化.out主方法中對應的變數不需要初始化.例子 using system using system.collections....

C 引數傳遞

2.指標與引用區別 3.引數為指標的指標或指標的引用 將實參複製乙份給形參,形參為函式的區域性變數,因此函式對形參操作對實參沒有影響。若傳遞物件會產生物件副本,會呼叫拷貝建構函式,操作完後要呼叫析構函式。形參為指向實參位址的指標,其也算一種按值傳遞,只不過是將實參的位址作為引數傳遞給形參,因此函式對...

C 引數傳遞

值型別值傳遞 public void add1 int a 值型別引用傳遞 public void add2 ref int a public void add3 out int a 呼叫 b 5 add1 b b 5,輸出10 add2 ref b b 10,輸出10 add3 out b b 1...