在呼叫函式時我們通常會向呼叫的函式傳遞引數,而這裡的引數有兩種方式傳遞進入函式,一種是將實參的變數名直接傳遞給呼叫函式,這種被稱為是引數傳值,而另一種是將實參的位址傳遞給呼叫函式,這種方式被稱為是引數傳址。
引數傳值相對來說使用比較多,而引數傳值其實就是將呼叫函式中的實參的值複製給了被調函式的形參,而對於被調函式來說他並不能真正的操作呼叫函式中的實參。
相對於傳值,傳址函式就可以對被調函式的實參進行操作了,因為是傳址,而在程式中乙個變數的位址是唯一的,當我們找到這個位址並對這個變數進行操作就會容易很多。下面我們以乙個例子程式及其執行結果來說明這兩者的不同。
下面我們分析程式及其執行結果:
int inum = 0x54;
int *ptr = &inum;
/* 分別列印指標ptr所指向的位址,變數inum的位址以及變數inum的值 */
printf("the ptr = %p ,&inum = %x ,inum = %x \n\r",ptr,&inum,inum);
void changevalue(int num)
/* 對inum進行函式changevalue操作後,分別列印指標ptr所指向的位址,變數inum的位址以及變數inum的值 */
changevalue(inum);
printf("the ptr = %p ,&inum = %x ,inum = %x \n\r",ptr,&inum,inum);
雖然在被調函式中num的值改變了,但是在主調函式中inum的值並沒有改變。因此引數傳值並不能改變實參的值。
int changepoint(int *ptr1)
printf("the ptr1'address is %p \n\r",ptr1);
return 0;
} /* 對ptr進行函式changepoint操作後,分別列印指標ptr所指向的位址,變數inum的位址以及變數inum的值 */
changepoint(ptr);
printf("the ptr = %p ,&inum = %x ,inum = %x \n\r",ptr,&inum,inum);
我們在上面的函式中同樣對指標進行了傳值操作,即將指標ptr的值傳遞給被調函式changepoint,而並沒有將指標ptr的位址傳遞過去,因此雖然我們申請了新的位址,但是對指標ptr進行改址操作是失敗的。
int changepoints(int **ptr1)
printf("the *ptr1'address is %p \n\r",*ptr1);
return 0;
} /* 對ptr的位址進行函式changepoints操作後,分別列印指標ptr所指向的位址,變數inum的位址以及變數inum的值 */
changepoints(&ptr);
printf("the ptr = %p ,&inum = %x ,inum = %x \n\r",ptr,&inum,inum);
這裡我們將指標ptr的位址傳遞給被調函式,在被調函式中對指標的位址 進行操作就可以實現對呼叫函式實參的操作了。因此我們發現指標ptr的位址改變了。 函式引數的傳值和傳址
函式呼叫引數傳值和傳址的區別 傳值 把引數拷貝乙個副本,然後傳遞給函式體進行操作。但是對引數的操作不會影響到函式外的引數,範圍僅在當前的函式內有效。1 void compare int a,int b 兩個引數大小的比較 1 void copy int des,int sou 將引數sou拷貝到引數...
指標 引用 傳值 傳址
個人總結 首先定義 struct binarytreenode 定義變數 1 binarytreenode ptreenode 2 binarytreenode n ptreenode 3 binarytreenode k 4 binarytreenode m k 引用變數必須初始化 定義 位址也稱...
傳值和傳址
let dadproto let sonproto dadproto sonproto.name 李四 console.log sonproto name 李四 age 20 console.log dadproto name 李四 age 20簡單資料型別 傳值 let a 10 let b a ...