既然已经了解了什么是指针之后,那我们就来看另一种更高级的形式:将指针变量放到形参中会怎么样?因为形式参数作为被调函数中的组成部分,它是先在内存中开辟了一个存储单元,然后采取“拿来主义”,将实参的内容传递给形参数。接下来是指针变量作为形参的示例代码:
代码一:
#include<stdio.h>
int main()
{
void swap(int * p1,int * p2);
int a,b;
int * x1,* x2;
printf("please enter a and b:\n");
scanf("%d%d",&a,&b);
x1=&a;
x2=&b;
if(a<b) swap(x1,x2);
printf("max=%d,min=%d\n",a,b);
return 0;
}
void swap(int * p1,int * p2)
{
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
为了更好地体现指针作为形参的含义,下面给出代码二:
#include<stdio.h>
int main()
{
void swap(int * p1,int * p2);
int a,b;
int * x1,* x2;
printf("please enter two integer numbers:\n");
scanf("%d%d",&a,&b);
x1=&a;
x2=&b;
if(a<b) swap(x1,x2);
printf("max=%d,min=%d\n",*x1,*x2);
return 0;
}
void swap(int * p1,int * p2)
{
int *p;
p=p1;
p1=p2;
p2=p;
}
然而我们输入一个 4和5 进去时,这两个代码的输出却不相同。代码一输出的是
max=5,min=4
但是代码二输出的却是:
max=4,min=5
显然,虽然两者代码相差不多,但运行结果却不相同,只有代码一符合我们的要求。
代码一中,swap函数长这样:
void swap(int * p1,int * p2)
{
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
它的意思是先在内存中开辟两个存指针变量的空间,是指针p1与p2,然后由于x1,与x2,分别指向了&a和&b,所以p1与p2也分别指向了&a与&b。在swap函数起作用时,其实全程都不关x1与x2的事,它们两个在一边歇着,而且此函数是一个空函数,所以也没有返回值。
在(上)中我们已经知道了*p的含义了,这代码中的意思就是将a,b地址下的内容给改变了,交换了两个地址下的内容,所以在主函数中输出a,b的时候,它们地址下的内容都改变了,所以输出就变化了,因为此时p1与p2仍然分别指向a,b,所以输出*p1,*p2时也是改变了。
再看代码二中的swap函数:
void main(int * p1,int * p2)
{
int *p;
p=p1;
p1=p2;
p2=p;
}
此swap函数中,第一步仍然是先在地址中找两个存储单元,用来存p1与p2,然后p1指的地址与x1的相同,p2指的地址与x2的相同,后面就全程没有x1和x2什么事情了。
所以p1就指到&a,p2指到了&b。接下来的操作就是让p1与p2指的地址进行交换,变成了p1指到&b,p2指到&a。
因为全程对x1,x2,a,b都没有进行改动,所以输入4和5,结果只会原封不动的输出。
用图示来表示就是
相信像我一样的初学者通过我个人的理解,应该可以对指针有了一个更清晰的掌握,初学者在编写程序时也可以更灵活地运用指针。