今天学习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时,我误删了最后一行的*,结果它又正常运行,这是为什么呢?