C C 兩個數交換引發的連環案

2021-08-28 16:24:36 字數 1287 閱讀 6821

1. 一般法

如何交換兩個數?一般來說,交換兩個數需要借助中間變數,即先令中間變數temp存放其中乙個數a,然後再把另乙個數b賦值給已被轉移資料的a,最後把存有a的中間變數temp賦值給b,這樣a和b就完成了交換。下段**就實現了這個功能:

#include using namespace std;

int main()

int main()

int main()

輸出  a=2;b=5

*p1=2;*p2=5

這種寫法的思想在於直接把兩個位址交換,認為位址交換之後元素就交換了,這裡產生了很大的誤區 .函式引數的傳送方式是單向一次性的,main函式傳給swap函式的「位址」其實是「無符號整數」,其本身也跟普通變數一樣只是「值傳遞」,swap函式對位址本身進行修改並不能對main函式裡的位址修改,能夠使main函式裡的資料發生變化的只能是swap函式中對位址指向的資料進行修改.

案情三:

void swap(int* p1,int* p2)
案情四:

void swap(int* p1,int* p2)
無輸出

既然*temp、*p1、*p2都可以「看成」int型變數,那完全就可以像普通變數那樣進行交換操作 .這種想法其實沒什麼問題,但在定義int型的指標變數temp時,temp沒有初始化 .也就是說,指標變數temp中存放的位址是隨機的,如果該隨機位址指向的是系統工作區間,那麼就會出錯 .那麼我們就可以在一開始時為temp賦值這樣就不會出錯了.

破案:

void swap(int* p1,int* p2)
輸出  a=5;b=2

*p1=5;*p2=2

void swap(int* p1,int* p2)
破案 :此處通過引用實現上面的效果:

void swap(int* &p1,int* &p2)
輸出  a=2;b=5

*p1=5;*p2=2

指標變數其實是unsigned型別的整數,而直接交換這樣的兩個整型變數是需要加引用的.

需要注意的是,由於引用是產生變數的別名,因此常量不可以使用引用. 於是上面的**中不可以寫成swap(&a,&b),而必須用指標變數p1和p2存放&a和&b,然後把指標變數作為引數傳入.

交換兩個數

問題 如果要求不使用臨時變數,應該如何交換兩個變數的值?解決這個題的方式有好幾種,第一種當然就是使用系統自帶的swap 函式了。不過,這種抖機靈的做法一般人很難欣賞,而且說不定它內部實現使用了臨時變數也說不定 這是使用臨時變數的做法,也是我們在c語言中常用的做法 func swap1 a inout...

兩個數的交換

一般思路 建立乙個臨時變數,以這個臨時變數為中間變數,利用賦值來完成兩個數的內容的相互交換。如下 include int main 優化方案 1.上述方法中需要另外建立乙個變數,略微有些麻煩,若是要求不能建立臨時變數,則可以採用數學上的加法來進行一些變通。如下 include int main 2....

Qt C 交換兩個數

在程式設計過程中,交換兩個數是我用常用的 這裡做下簡單的搬運 bool widget swap int a,int b 這種方式其實是沒有改變的ab兩個引數的值的,只有在函式裡面,ab的值是改變的,但是在函式外面,ab的值還是沒有改變的 bool widget swap point int a,in...