swap()函数
方法一:指针法
实参:&a
形参:*x
#include<stdio.h>
void MySwap(int *x,int *y);
int main(){
int a=5,b=9;
printf("交换前:a=%d,b=%d \n",a,b);
MySwap(&a,&b);
printf("交换后:a=%d,b=%d \n",a,b);
return 0;
}
void MySwap(int *x,int *y){
int temp=*x;//如果写成int *p=x;x=y;y=p;则还是无法改变实参的值
*x=*y;
*y=temp;
}
方法二:引用法
实参:a
形参:&x
#include<stdio.h>
void MySwap(int &x,int &y);
int main(){
int a=5,b=9;
printf("交换前:a=%d,b=%d \n",a,b);
MySwap(a,b);
printf("交换后:a=%d,b=%d \n",a,b);
return 0;
}
void MySwap(int &x,int &y){
int temp=x;
x=y;
y=temp;
}
对于函数体的编写方式:
//方法一: 基本方法
/*
int temp = 0;
temp = b;
b = a ;
a = temp;
*/
//方法二: 数学方法
/*
a = a + b;
b = a - b;
a = a - b;
*/
参考博客:
1.https://blog.csdn.net/duan_jin_hui/article/details/50879338
2.https://blog.csdn.net/hyqsong/article/details/51371381
3.https://blog.csdn.net/Scalpelct/article/details/52226415
4.https://blog.csdn.net/litao31415/article/details/40183647
swap()函数利用指针操作字符数组:
1. 方法一(推荐):
#include<stdio.h>
#include<string.h>
void swap(char *p,char *q);
int main(){
char a[10]="china",b[10]="english";
swap(a,b);
printf("a=%s ; b=%s\n",a,b);
return 0;
}
void swap(char *p,char *q){
char temp;
do{
temp=*p;
*p=*q;
*q=temp;
}while(*++p|*++q);//注意不能写成(*++p||*++q)
}
- 代码说明
- do{ … }while( * ++p | * ++q); 语句的解读
1.1注意不能写成(* ++p || * ++q’);因为“ || ”和“ | ”有着本质的区别,不要弄混淆。//否则运行结果:a=echinnglis ; b=a
1.2注意不能写成 while(* ++p | * ++q){…}因为“ do{…}while(); ”和“ while{…} ”也有着本质的区别,不要弄混淆。//否则运行结果: a=cnglish ; b=ehina
1.3 注意可以写成( * p++ || * q++);但并不意味着“ * q++ ”和“ * ++p ”是完全一样的。//运行结果:a=english ; b=china
1.4 while(*++p | *++q);
等价于 while( *++p!=’\0’ | *++q!=’\0’);(因为’\0’的ASCII码值为0)
也等价于 while( *(++p)!=’\0’ | *(++q)!=’\0’);(运算符的结合律决定的)
也可以写成 while(*p++!=’\0’|*q++!=’\0’);(但 * (p++) 本身并不等同于 *(++p),具体见下 )
- 针对1.3拓展说明:
1)*p++ : 等同于 *(p++);因为++和 *同优先级;先引用p的值,实现 *p的运算,然后p自增1;
2) * (p++) 不等同于 *(++p) ;(假设p的初值为a,即&a[0])
前者 *(p++) :① *p ②p++ ; 若输出 *(p++),得到a[0]的值;
后者 *(++p):①p++ ② *p; 若输出 *(++p),得到a[1]的值;
3)++(*p):表示p所指向的元素值+1;假设p=a,则++(*p)相当于++a[0];
注意:是元素的值加1,而不是指针p的值加1; - 针对1.2拓展说明:如果非要用while语句,则可以使用以下函数体(效果一样)
void swap(char *p,char *q){
char temp;
while(1){
temp=*p;
*p=*q;
*q=temp;
if(!*++p & !*++q)//等价于if(*++p=='\0' & *++q=='\0');//也可以写成 if(!*p++ & !*q++)
break;
}
}
2. 方法二:
#include<stdio.h>
#include<string.h>
void swap(char *p,char *q,int len);
int main(){
char a[10]="china",b[10]="english";
int Max_len=strlen(a)>strlen(b)?strlen(a):strlen(b);//需要string.h头文件
swap(a,b,Max_len);//需要传入数组(两个数组中最大的)长度
printf("a=%s ; b=%s\n",a,b);
return 0;
}
void swap(char *p,char *q,int len){
char temp;
for(int i=0;i<len;i++,p++,q++){
temp=*p;
*p=*q;
*q=temp;
}
}
运行截图
代码说明
也可以不通过函数,直接使用 string.h 头文件下的 strcpy() 函数,引入第三个数组进行交换操作:
#include<stdio.h>
#include<string.h>
int main(){
char a[10]="china",b[10]="english";
char temp[10];
strcpy(temp,a);//需要string.h头文件
strcpy(a,b);//表示将字符串b的值复制给字符串a;
strcpy(b,temp);
printf("a=%s ; b=%s\n",a,b);
return 0;
}
在实际开发中,可以使用函数重载实现swap()的功能
#include<stdio.h>
#include<string.h>
//注意形参的写法
void swap(char *p,char *q);
void swap(int &a,int &b);
int main(){
char a[10]="china",b[10]="english";
int c=12,d=23;
//注意实参的写法
swap(a,b);
swap(c,d);
printf("a=%s ; b=%s\n",a,b);
printf("c=%d ; d=%d\n",c,d);
return 0;
}
void swap(char *p,char *q){
char temp;
do{
temp=*p;
*p=*q;
*q=temp;
}while(*++p|*++q);
}
void swap(int &x,int &y){//函数重载
int temp=x;
x=y;
y=temp;
}