指針使用練習swap
經典例子
兩個數的交換
1)值交換
#include<stdio.h>
void swap1(int a,int b){
int tmp = a;
a = b;
b = tmp;
//副本內部交換 無效
printf("here a:%d,b:%d\n",a,b);
}
int main(){
int a = 12;
int b = 13;
swap1(a,b);//
printf("a:%d b:%d",a,b);
return 0;
}
使用指針實現真正的交換
#include<stdio.h>
//兩個數的交換
void change(int *x,int *y){
//x,y 得到地址,分別指向a,b進行操作
int tmp = *x;//tmp存儲值
*x = *y;//*運算 取到值 之後正常交換
*y = tmp;
}
int main(){
int a,b;
scanf("%d%d",&a,&b);
change(&a,&b);//傳入地址
printf("%d %d\n",a,b);
return 0;
}
在函數中交換兩者的地址??地址本質上也是無符號整數,因此可看作數值,我們知道傳入數值時相當於在函數內對副本進行交換,不會在主函數實際地交換值,那麼交換地址也是無效的。
代碼如下:
void swap2(int *a ,int *b){
int *tmp = a;
a = b;
b = tmp;
}
引用的使用:引用直接指向調用它的對象
#include<stdio.h>
void change(int &x){//引用 指向原變量的修改
x = 11;
}
int main(){
int a = 10;
change(a);//a的值改變
printf("%d",a);
return 0;
}
#include<stdio.h>
void swap2(int* &a ,int* &b){
//這裏引用指向p,q指針,使用引用對指針真正的修改
int *tmp = a;//交換指針變量,加引用
a = b;
b = tmp;
//交換地址 只是副本
}
int main(){
int a = 12;
int b = 13;
int *p = &a;
int *q = &b;
swap2(p,q);//利用指針交換,交換兩個值
printf("a:%d b:%d",*p,*q);
return 0;
}
三個數由大到小的排序
#include<stdio.h>
void line(int *x,int *y,int *z){
//兩兩比較,若前面的數比後面的數小 則交換到後面去
if(*x < *y){
int tmp1 = *x;
*x = *y;
*y = tmp1;
}
if(*y < *z){
int tmp2 = *y;
*y = *z;
*z = tmp2;
}//最大的交換到最後一個位置
if(*x < *y){
int tmp3 = *x;
*x = *y;
*y = tmp3;
}
//前面兩個的最終比較
}
int main(){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
line(&a,&b,&c);
printf("%d %d %d\n",a,b,c);
return 0;
}
三個字符串由小到大排序 類似於三個數的思想
#include<stdio.h>
#include<string.h>
void swap3(char *x,char *y){
//兩兩交換
char tmp[20];
strcpy(tmp,x);
strcpy(x,y);
strcpy(y,tmp);
}
int main(){
char a[20];
char b[20];
char c[20];
gets(a);
gets(b);
gets(c);
if(strcmp(a,c)>0){
swap3(a,c);
}
if(strcmp(b,c)>0){
swap3(b,c);
}//保證最大的放在最後,對前兩個進行排序
if(strcmp(a,b)>0){
swap3(a,b);
}
puts(a);
puts(b);
puts(c);
return 0;
}
將數組中的最小值與第一個數交換,將數組中的最大值與最後一個數交換
#include<stdio.h>
void funcin(int *a){
for(int i=0;i<10;i++){
scanf("%d",a+i);
}
}
void change(int *a){
int minx = a[0];
int maxx = a[0];
for(int i = 1;i<10;i++){
//**找最小值的方法:先找最小值,再遍歷最小值所在位置,互換**
if(a[i] < minx){
minx = a[i];
}
}
for(int j=1;j<10;j++){
if(*(a+j)==minx){
//交換
int tmp = *a;
*a = *(a+j);
*(a+j) = tmp;
}
}
//對於最大值
for(int i = 1;i<=9;i++){
if(a[i] > maxx){
maxx = a[i];
}
}
for(int j=1;j<=9;j++){
if(*(a+j)==maxx){
int tmp = *(a+9);
*(a+9) = *(a+j);
*(a+j) = tmp;
}
}
}
void funcout(int *a){
for(int i=0;i<10;i++){
if(i==9){
printf("%d\n",*(a+i));
}
else{
printf("%d ",*(a+i));
}
}
}
int main(){
int a[10];
funcin(a);
change(a);
funcout(a);
return 0;
}