main() { int a,b; int *pointer_1, *pointer_2; a=100;b=10; pointer_1=&a; pointer_2=&b; printf("%d,%d\n",a,b); printf("%d,%d\n",*pointer_1, *pointer_2); }
对程序的说明:
1)在开头处虽然定义了两个指针变量pointer_1和pointer_2,担它们并未指向任何一个整型变量。只是提供两个指针变量,规定它们可以指向整型变量。程序第5、6行的作用就是使pointer_1指向a,pointer_2指向b。
2) 最后一行的*pointer_1和*pointer_2就是变量a和b。最后两个printf函数作用是相同的。
3) 程序中有两处出现*pointer_1和*pointer_2,请区分它们的不同含义。
4) 程序第5、6行的“pointer_1=&a”和 “pointer_2=&b”不能写成“*pointer_1=&a”和 “*pointer_2=&b”。
请对下面再的关于“&”和“*”的问题进行考虑:
1) 如果已经执行了“pointer_1=&a;”语句,则&*pointer_1是什么含义?
2) *&a含义是什么?
3) (pointer_1)++和pointer_1++的区别?
main() { int *p1,*p2,*p,a,b; scanf("%d,%d",&a,&b); p1=&a;p2=&b; if(a< b) {p=p1;p1=p2;p2=p;} printf("\na=%d,b=%d\n",a,b); printf("max=%d,min=%d\n",*p1, *p2); }
函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。
swap(int *p1,int *p2) {int temp; temp=*p1; *p1=*p2; *p2=temp; } main() { int a,b; int *pointer_1,*pointer_2; scanf("%d,%d",&a,&b); pointer_1=&a;pointer_2=&b; if(a< b) swap(pointer_1,pointer_2); printf("\n%d,%d\n",a,b); }
对程序的说明:swap是用户定义的函数,它的作用是交换两个变量(a和b)的值。swap函数的形参p1、p2是指针变量。程序运行时,先执行main函数,输入a和b的值。然后将a和b的地址分别赋给指针变量pointer_1和pointer_2,使pointer_1指向a,pointer_2指向b。
接着执行if语句,由于a〈b,因此执行swap函数。注意实参pointer_1和pointer_2是指针变量,在函数调用时,将实参变量的值传递给形参变量。采取的依然是“值传递”方式。因此虚实结合后形参p1的值为&a,p2的值为&b。这时p1和pointer_1指向变量a,p2和pointer_2指向变量b。
接着执行执行swap函数的函数体使*p1和*p2的值互换,也就是使a和b的值互换。
函数调用结束后,p1和p2不复存在(已释放)如图。
最后在main函数中输出的a和b的值是已经过交换的值。
请注意交换*p1和*p2的值是如何实现的。请找出下列程序段的错误:
swap(int *p1,int *p2) {int *temp; *temp=*p1; /*此语句有问题*/ *p1=*p2; *p2=temp; }
请考虑下面的函数能否实现实现a和b互换。
swap(int x,int y) {int temp; temp=x; x=y; y=temp; }
如果在main函数中用“swap(a,b);”调用swap函数,会有什么结果呢?请看下图所示。