關於交換函式的指標內容

2021-08-21 07:51:36 字數 1754 閱讀 4260

首先讓我們來寫乙個簡單的交換函式:

void swap(int a,int b)

int tmp = a;

a = b;

b = tmp;

printf("%d,%d\n",a,b);

int main()

int a = 10;

int b = 20;

printf("%d,%d\n",a,b);

swap(a,b);

return 0;

執行以上程式,我們會得到想要的結果。但是,如果將swap函式中的輸出語句(printf("%d,%d\n",a,b);)去掉以後,竟然不是我們所期待的答案,此時我們就應該思考所寫的程式是否正確,無疑寫錯了呀,不然怎麼會出現我們不想要的結果。讓我來分析為什麼不正確:

我們的目標是讓主函式中的a值變為20,b值變為10;實現的手段是交換函式。

在程式執行時,給a和b分別分配乙個記憶體,其中儲存a和b的值,程式執行到swap函式時,給其中的a和b賦值主函式傳過來的值。

進入swap函式中並執行接下來的程式。

此時我們就可以看出,swap中a和b的值確實交換了,如果有輸出函式的話,就會得到我們想要的結果,但是我們要清楚,我們的目標是主函式中a和b的值進行交換,然而主函式中a和b的值並未發生改變,所以我們的目標還是沒有達到。想要修改主函式中a和b的值,我們就需要訪問它的位址,由此我們需要借助指標來達到在swap函式中修改主函式中a和b的值。

紅色的表示各個變數的位址。執行主函式時,將主函式中a和b的位址傳給swap函式中的指標變數p1和p2,p1與a建立某種聯絡,p2與b建立某種聯絡。接著執行函式swap的程式。

對*p1(對p1進行解引用)的值賦給tmp,*p2的值賦給*p1,最後將tmp的值賦給*p2,交換完成。現在我們可以看出,主函式中a和b的值發生我們需要的變化,這也意味著我們的目標達到了。

於是我們得到乙個結論:乙個函式要想修改另乙個函式的資料,必須傳指標和解引用。

在這裡我們還需要注意交換函式的其他兩種錯誤寫法:

第一種void swap(int *p1,int *p2)

*tmp = *p1;//程式在此處奔潰,不能在*tmp處寫資料

*p1 = *p2;

*p2 = *tmp;

第二種void swap(int *p1,int *p2)

int *tmp;

tmp = p1;

p1 = p2;

p2 = tmp;

函式指標 關於函式指標與指標函式

指標函式顧名思義,本質還是函式,不同的是改函式的返回型別為指標型別。接下來我們舉個例子。include using namespace std char output intmain 這裡的char output 就是個指標函式 char 的函式,即返回值為char 型別的。這裡的 如果gcc g ...

關於函式指標與指標函式

函式指標 在程式執行中,函式 是程式的演算法指令部分,它們和陣列一樣也占用儲存空間,都有相應的位址。可以使用指標變數指向陣列的首位址,也可以使用指標變數指向函式 的首位址,指向函式 首位址的指標變數稱為函式指標。1 函式指標定義 函式型別 指標變數名 形參列表 函式型別 說明函式的返回型別,由於 的...

關於函式指標

函式存放在記憶體的 區域內,它們同樣有位址,我們如何能獲得函式的位址呢?如果我們有乙個int test int a 的函式,那麼,它的位址就是函式的名字,這一點如同陣列一樣,陣列的名字就是陣列的起始位址。定義乙個指向函式的指標用如下的形式,以上面的test 為例 int fp int a 這裡就定義...