目录
swap数值交换方法:
change2()与change3()方法正确,change1()为错误实例演示,运行程序可以看到指针指向地址数值,从而理解错误原因。(change3为改进算法)
#include <stdio.h>
#include <stdlib.h>
//int *p1,*p2,*p3;
int main()
{
void change1(int *b1,int *b2);//声明函数
void change2(int *b1,int *b2);//声明函数
void change3(int *b1,int *b2);//声明函数
printf("pointer!\n");
int a1,a2,a3;
a1=1; a2=2; a3=3;
int *p1,*p2,*p3=&a3;
//p3=&a3;
p1=&a1;
p2=&a2;
printf("未互换地址时p1,p2,p3:%d,%d,%d\n",*p1,*p2,*p3);
printf("----------------------------------------\n");
printf("错误实例,仅改指针b1,b2值,p1,p3并未变\n");
printf("未互换P:%d,%d,%d\n",p1,p2,p3);
change1(p1,p3);//等价change(&a1,&a3);
printf("互换后P:%d,%d,%d\n",p1,p2,p3);
printf("互换地址后p1,p2,p3:%d,%d,%d\n",*p1,*p2,*p3);
printf("----------------------------------------\n");
//使用改进实例需要将其余部分注释掉,因为全局变量和局部变量重名冲突了
// printf("改正实例:既然是p1,p2没交换,最后更改以下即可\n");//需要定义指针为全局变量
// printf("p1=b1,p3=b2\n");
// printf("未互换P:%d,%d,%d\n",p1,p2,p3);
// change3(p1,p3);//等价change(&a1,&a3);
// printf("互换后P:%d,%d,%d\n",p1,p2,p3);
// printf("互换地址后p1,p2,p3:%d,%d,%d\n",*p1,*p2,*p3);
//
// printf("----------------------------------------\n");
printf("正确实例:既然是a1,a2对象交换,函数就要进行对象的交换*p1,*p2\n");
printf("p1->a1;temp=a1;p1=p2->a2;p2=temp->a1\n");
printf("未互换P:%d,%d,%d\n",p1,p2,p3);
change2(p1,p3);//等价change(&a1,&a3);
printf("互换后P:%d,%d,%d\n",p1,p2,p3);
printf("互换地址后p1,p2,p3:%d,%d,%d\n",*p1,*p2,*p3);
printf("----------------------------------------\n");
return 0;
}
void change1(int *b1,int *b2){
int *b=NULL;//防止野指针
b=b1;//b存b1存储的地址值
b1=b2;
b2=b;//b1 ,b2存储的地址值互换
printf("互换后B:%d,%d\n",b1,b2);
}
void change3(int *b1,int *b2){
int *b=NULL;//防止野指针
b=b1;//b存b1存储的地址值
b1=b2;
b2=b;//b1 ,b2存储的地址值互换
printf("互换后B:%d,%d\n",b1,b2);
p1=b1;
p3=b2;
printf("互换后P:%d,%d\n",p1,p2);
}
void change2(int *b1,int *b2){
int temp;//
temp=*b1;//
*b1=*b2;
*b2=temp;//b1 ,b2存储的地址值互换
printf("互换后B:%d,%d\n",b1,b2);
}
改进后的change3算法:
#include <stdio.h>
#include <stdlib.h>
int *p1,*p2,*p3;
int main()
{
void change2(int *b1,int *b2);//声明函数
printf("pointer!\n");
int a1,a2,a3;
a1=1; a2=2; a3=3;
//int *p1,*p2,*p3=&a3;
p3=&a3;
p1=&a1;
p2=&a2;
printf("----------------------------------------\n");
//使用改进实例需要将其余部分注释掉,因为全局变量和局部变量重名冲突了
printf("改正实例:既然是p1,p2没交换,最后更改以下即可\n");//需要定义指针为全局变量
printf("p1=b1,p3=b2\n");
printf("未互换P:%d,%d,%d\n",p1,p2,p3);
change3(p1,p3);//等价change(&a1,&a3);
printf("互换后P:%d,%d,%d\n",p1,p2,p3);
printf("互换地址后p1,p2,p3:%d,%d,%d\n",*p1,*p2,*p3);
printf("----------------------------------------\n");
return 0;
}
void change3(int *b1,int *b2){
int *b=NULL;//防止野指针
b=b1;//b存b1存储的地址值
b1=b2;
b2=b;//b1 ,b2存储的地址值互换
printf("互换后B:%d,%d\n",b1,b2);
p1=b1;
p3=b2;
printf("互换后P:%d,%d\n",p1,p2);
}