C程序设计--指针(swap函数)

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)
}

  • 代码说明
  1. 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;
}

  • 3
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值