今天学习c语言指针部分,又发现一个好好玩的现象,记录下来,以后可以翻阅提醒自己别犯错
#include<stdio.h>
#include<stdlib.h>
void swap(int *p1,int *p2)
{
int p = *p1;
*p1 = *p2;
*p2 = p;
}
void swap2(int *p1,int *p2)
{
int *p;
p = p1;
p1= p2;
p2 = p;
}
void swap3(int *p1,int *p2)
{
<span style="white-space:pre"> </span>
int *p = *p1;
*p1 = *p2;
*p2 = *p;
}
void swap4(int *p1,int *p2)
{
int m;
int *p = &m;
*p = *p1;
*p1 = *p2;
*p2 = *p;
}
void swap5(int *p1,int *p2)
{
int *p = *p1;
<span style="white-space:pre"> </span>*p1 = *p2;
<span style="white-space:pre"> </span>*p2 = p;
}
void main()
{
int a,b;
int *point1,*point2;
point1 = &a;
point2 = &b;
scanf("%d,%d",&a,&b);
if(a < b)
{
swap(point1,point2);
//swap2(point1,point2);
}
printf("\n %d,%d",*point1,*point2);
system("pause");
}
调用swap时,值生效了,调用swap2时值没有生效,刚开始好诧异,这是为什么呢?同样传地址过去
后来再仔细看一遍,想了一下,原来,swap是把地址里面的内容交换了,swap2是把指针换了一个位置,但是里面的内容并没有交换,这应该是初学者比较容易犯2的地方吧,以后要小心。
swap3感觉很正常,就是一个交换的函数,编译也是通过的,可是运行时就出错了。这是为啥呢?
原来一个指针声明时是需要初始化的,需要使用者明确告诉它需要指向哪里,所以swap4可以先声明一个int 类型的变量,让指针指向它,这样就可以正确运行了。
但是又有一个疑惑的地方,在swap5时,我误删了最后一行的*,结果它又正常运行,这是为什么呢?