1. 程式人生 > >對C語言中交換兩個數是否交換成功的一點理解

對C語言中交換兩個數是否交換成功的一點理解

在學習指標的時候老師會給一個用變數做引數的交換兩個數小程式設計,但是,那個程式設計中兩個數的值交換前後卻沒有變化,然後老師由此引入指標。一開始我也不理解為什麼同樣的交換步驟,為什麼有時候可以有時候不可以,然後請教了師兄,師兄講的很好也很專業,可是我還是似懂非懂。。。然後,現在又再仔細地寫了不同情況的交換兩個數,終於算是懂了。(下面是我的一點理解,如果有錯誤,麻煩指出,謝謝!)

//【1】這是指標課題引入的那個程式設計,這裡兩個數的值交換不成功

#include<stdio.h>
void swap(int a,int b){
int temp=a; //temp==10
a=b; //a==20;
b=temp; //b==10
}
void main(){
int x=10,y=20;
printf("Before swap:x=%d,y=%d\n",x,y); //x==10,y==20
swap(x,y);
printf("After swap:x=%d,y=%d\n",x,y); //x==10;y==20
}

理解:這裡是寫了一個子函式,而且子函式的引數是變數,在書裡有說變數作為引數時,進行的是傳值,也就是實參與形參分別佔用不同的記憶體單元,所以,雖然在子函式的內部a,b的值進行了交換,可是交換後的值卻不能傳給實參(實參的值可以傳給形參,形參的值不能傳給實參),所以x,y的值不會變。

//【2】下面這個程式設計就是我看到上面那個程式設計想到的,當時我很疑惑,為什麼這裡類似的步驟(兩個數進行交換的三個賦值語句),卻又不同的結果。這裡兩個數交換成功。

#include<stdio.h>
void main(){
int a,b,c;
a=20;
b=10;
printf("before:a=%d,b=%d",a,b);
c=a;//c==20
a=b;//a==10
b=c;//b==20
printf("\nafter:a=%d,b=%d",a,b);
}

理解:要注意看到一點,這裡只有一個主函式,並沒有進行函式的呼叫。這裡三個賦值語句是進行了拷貝,這個拷貝過程直接就將a的值改為20,b的值改為10。注意區別上面那個程式設計對函式的呼叫,雖然上面那個也進行了拷貝,但是它改變的只是子函式中a,b的值,並未改變主函式中x,y的值。

//【3】然後我有想到會不會是因為a,b已經有初始化值,如果它們的值是由我們輸入的,會不會交換成功。然後又寫了下面這個程式設計,發現交換成功。這說明scanf對著並沒有影響。

#include<stdio.h>
void main(){
int a,b,c;
printf("please enter two number:");
scanf("%d%d",&a,&b);
printf("before:a=%d,b=%d\n",a,b);
c=a;
a=b;
b=c;
printf("after:a=%d,b=%d",a,b);
}

//【4】在之前師兄給我解釋的時候,他告訴我基本資料型別之間進行的是傳值,而非基本資料型別(如 陣列)進行的是傳址,然後我就嘗試用陣列,對兩個數進行交換。這個程式設計也是交換成功。

#include<stdio.h>
void swap(int a[2]){//陣列做函式引數時,是傳址
int temp=a[0]; 
a[0]=a[1]; 
a[1]=temp; 
}
void main(){
int x[2]={10,20};
printf("Before swap:x[0]=%d,x[1]=%d\n",x[0],x[1]); 
swap(x);
printf("After swap:x[0]=%d,x[1]=%d\n",x[0],x[1]); 

}

理解:當陣列作為引數時,進行的是傳址,而且實引數組元素和形引數組元素佔用同一段記憶體單元,改變形引數組的值也將改變實引數組的值,也就是說子函式中的a[0],a[1]的值改變了,主函式的x[0],x[1]頁會跟著改變所以實現了兩個數的交換。

//雖然這些看起來好像很低階,但是還是想寫下來,給自己加深印象