何为指针?指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。
例如:
int *p; //* 表示指针说明符:说明变量p是一个指针,只会在定义变量的时候出现
int a;
p = &a; // &符号表示取a的地址,如果a是数组p=a,表示数组的首地址
a=5; // *p = 5; *代表指针运算符,访问对应地址里面的内容
今天要说的是,两个变量之间的交换,用普通的变量和指针有何不同?先来看下面的一个例子:
这里提一下,关于交换变量的几种方法,详见C语言交换变量方法,这里就不再重复了。
#include<stdio.h>
void swap(int x,int y){
//交换前的x,y
printf("x,y交换前: x = %d,y = %d\n",x,y);
x^=y;
y^=x;
x^=y;
//交换后的x,y
printf("x,y交换后: x = %d,y = %d\n",x,y);
}
int main(){
int a=9,b=2;
//交换前的a,b
printf("a,b交换前: a = %d,b = %d\n",a,b);
swap(a,b);
//交换后的a,b
printf("a,b交换后: a = %d,b = %d\n",a,b);
}
相信大家都很明白,这个方法无非就是交换a,b两个变量的值,但是,结果是怎样呢?
x,y的值发生了交换,但是a,b的值并未发生交换,这是因为我们只是将a,b的值作为一个参数传递到swap中,我们改变的只是函数swap里面的数据,若是要使a,b两个变量的值交换,需要怎么做呢?
这里,就要用到我们的指针了,其实,两个对比之后你会发现,代码几乎没变,只是之前是传入a,b的值,现在传的是a,b的地址。
#include<stdio.h>
void swap(int *x,int *y) {
printf("x,y交换前: x = %d,y = %d\n",*x,*y);
*x^=*y;
*y^=*x;
*x^=*y;
printf("x,y交换后: x = %d,y = %d\n",*x,*y);
}
int main() {
int a=9,b=2;
printf("a,b交换前: a = %d,b = %d\n",a,b);
swap(&a,&b);
printf("a,b交换后: a = %d,b = %d\n",a,b);
}
接下来,来看看它的结果:
其实,这也不难理解,毕竟我传的是一个地址过去,地址里面的值发生改变,但是我a,b的地址并没有变,所以说a,b的值就也发生改变了。