指標作為函式引數傳參的問題

2021-10-05 01:45:30 字數 1357 閱讀 1415

在大一的時候就遇到的乙個當時一直懂得不太透徹的問題: 使用函式來交換兩個變數的值. 現在常常用到algorithm標頭檔案裡的swap函式, 因此決定整理一下這個問題. 希望能對後來者有所幫助.

首先, 要知道的乙個結論是函式引數的傳遞是單向的, 也就是實參→形參, 無法完成形參→實參的引數傳遞.

因此, 像下面這種寫法無法完成兩個變數值的交換:

void swap(int a, int b)
可以理解為這個函式中的a和b都是由實參賦值過來, 但是在不知道實參位址的情況下是沒有辦法向實參賦值的, 而且這個函式內部的兩個變數的作用域只有這個函式, 函式執行完畢後a和b都被釋放.

同樣地,下面這種做法也沒有辦法實現變數值的交換:

void swap(int * a, int *b)
這種寫法的思想在於直接把兩個位址進行交換, 錯誤地認為位址交換後值也就交換了, 其實,這種想法的誤區和上面的誤區相同: 錯誤地認為,swap函式裡面交換完位址後main函式裡面的位址也交換了, (上面的誤區是認為swap函式裡的變數交換完成後main函式裡的變數也交換了),位址也只是乙個"無符號的整型"資料,其本身也跟普通變數一樣是值的傳遞, 區別在於,我們可以通過這個值來去物理記憶體中找到的具體位址空間, 然後對這個位址空間進行訪問.

下面這種做法就是通過這個位址來對物理記憶體進行訪問從而進行變數值的交換.

void swap(int *a, int *b)
這裡要注意的是,有些時候我們可能會把這個函式寫成如下形式:

void swap(int *a, int *b)
這裡是許多初學者都會犯的錯誤, 這個函式的問題在於:temp指標沒有被初始化(也就是"野指標"),他可能會指向某些系統工作記憶體, 這樣的話就會出錯.

因此,我們可以把上面這個函式進行如下修改即可以實現兩個變數值的交換:

void swap(int *a, int *b)
最後還有一種方法來實現值的交換:引用.

void swap(int &a, int &b)
這裡swap的引數變成了兩者引用, 引用可以理解為傳進來的實參的另乙個別名, 他們所指向的位址空間為同乙個位址空間, 因此當對引用的值進行改變的時候, 實參的值也會改變.

此外,還有一些方法如採用全域性變數, 靜態變數等等方法來實現值的交換,這裡不做贅述.

c 用指標將函式作為引數傳參

今天發現了一種寫法,順便記錄一下。廢話不多說,先看 include using namespace std int addition int x,int y int subtraction int x,int y int operation int x,int y,int function int,...

C 指標作為函式引數的問題

其實,對於c 或者c 最難的一塊地方估計就是指標了。指標是強大的,但也是很多人載在這裡的地方。前段時間寫了一篇文章 c 之 陣列與指標的異同 對c 和c 中的指標做了乙個初步的講解。這次將講解一下指標作為函式引數傳遞的問題。很多人對於指標的使用是有所了解的,但還是經常會載在指標的問題上,是因為還不夠...

指標作為函式形參

先來看兩個程式 程式1 include void fun int p int main void 輸出為 程式2 include void fun int p int main void 輸出為 對於程式2,不難理解 程式1,明明改變了p的指向了,為什麼還是輸出1呢?其實問題的關鍵不是指標作為形參的...