临近毕业,还有找工作的事情,繁忙之际还是坚持看一下C语言的知识,重点的地方或者不清楚的地方还是要记录一下。
本章以指针作为函数传参来说一下学习心得,大部分内容源自C语言程序设计课本。
首先从C语言中函数参数的传递方向说起,大家都知道,C语言中函数参数的传递方向是单向的,只能由主调函数的实参传递到被调函数的形参,而形参的值不能传递给实参。但是依据传送的内容可以将函数参数分为值型参数和指针型参数。通常来说,值型参数用来传值,而指针型参数用来传地址。可以看出,指针型参变量得到的是主调函数中某个变量的地址,因此可以通过间接存取运算,操作主调函数中的变量,从而将指针型形参的指向域扩大到主调函数,达到与主调函数双向交换数据的目的。这样,指针形参数的作用完全可以替代全局变量,而且可以弥补全局变量的不足之处。
下面举三个例子来说明,让大家更清楚的理解指针型变量的存在意义。
例1
void swap(int x, int y);
void main()
{
int x, y;
scanf_s(“%d%d”,&x,&y);
printf(“1:x=%d y=%d\n”, x, y);
swap(x,y);
printf(“1:x=%d y=%d\n”, x, y);
}
void swap(int x,int y)
{
int temp;
printf(“子函数中交换前:x=%d,y=%d\n”, x, y);
temp = x; x = y; y = temp;
printf(“子函数中交换后:x=%d,y=%d\n”, x, y);
}
结果如图:
例2
void swap(int *x, int *y);
void main()
{
int x, y;
scanf_s(“%d%d”,&x,&y);
printf(“1:x=%d y=%d\n”, x, y);
swap(&x,&y);
printf(“2:x=%d y=%d\n”, x, y);
}
void swap(int *x,int *y)
{
int temp;
printf(“子函数中交换前:*x=%d,*y=%d\n”, *x, *y);
temp = *x; *x = *y; *y = temp;
printf(“子函数中交换后:*x=%d,*y=%d\n”, *x, *y);
}
运行结果:
例3
void swap(int *x, int *y);
void main()
{
int x, y;
scanf_s(“%d%d”,&x,&y);
printf(“1:x=%d y=%d\n”, x, y);
swap(&x,&y);
printf(“2:x=%d y=%d\n”, x, y);
}
void swap(int *x,int *y)
{
int *temp;
printf(“子函数中交换前:*x=%d,*y=%d\n”, *x, *y);
temp = x; x = y; y = temp;
printf(“子函数中交换后:*x=%d,*y=%d\n”, *x, *y);
}
从这里可以得到如下结论:
1.例1说明函数间参数只能单向传递。
2.例2说明当指针变量作为函数传递参数时,形参和实参形参和实参同时指向同一内存地址。
3.虽然交换了形参x和y的指向,但是指针型参数也必须遵循单向传递规则,x和y的值不会回传给实参。