必备知识:c语言中的函数调用和指针变量的相关知识
众所周知,函数是C语言中一个十分重要的模块,因为函数的存在,使得C语言的可读性、可维护性、可移植性大大提高。因此,想要学好C语言,必须要学好函数。函数的一个功能就是传递数值进行运算,那么我们如何利用函数和指针变量通过形参变量的值改变实参变量的值呢?
首先,让我们先举一个例子。
#include<stdio.h>
int main()
{
void func(int a,int b);
int x,y;
printf("please enter two numbers:\n");
scanf("%d%d",&x,&y);
func(x,y);
printf("%d,%d\n",x,y);
}
void func(int a,int b)
//函数的功能若a>b,则调换a,b的值
{
int c;
if(a>b)
{
c=a;
a=b;
b=c;
}
}
结果:
分析:函数func的功能是若a>b,则调换a,b的值,而我们输入的数为12,6,且12>6,但是值却没有按预期调换,为什么呢?
这是因为函数调用中,虚实结合传递的是变量的值,且为单向传递,即实际参数向形式参数传递值,但是形式参数却不能向实际参数传递值。因此,在上述的程序中,虽然x的值12传给了a,y的值6传给了b,在被调用的函数func中,a,b的值确实互换了,但是却不能影响实参x,y的值。因此,在调用结束后,x,y的值是不会变化的。
下面,就开始引入今天的重头戏--指针变量。我们仍然通过一个程序来说明。
ps:不是我太懒,只是只有通过具体的程序才能更好的理解。
#include
int main()
{
void func(int *a,int *b);
int x,y;
int *x_pointer,*y_pointer;
printf("please enter two numbers:\n");
scanf("%d,%d",&x,&y);
x_pointer=&x;
y_pointer=&y;
func(x_pointer,y_pointer);
printf("The result:\n");
printf("%d,%d\n",x,y);
}
void func(int *a,int *b)
//函数的功能若a>b,则调换a,b的值
{
int c;
if(*a>*b)
{
c=*a;
*a=*b;
*b=c;
}
}
结果:
上面的程序成功地交换了x,y的值,这是为什么呢?
上述函数调用中,虚实结合传递的仍然是变量的值,且为单向传递,却仍能交换x,y的值,why?
这就要归功于指针变量了!指针变量即为地址变量,是储存变量在内存中地址的变量。x_pointer=&x,y_pointer=&y即为使x_pointer储存x的地址,y_pointer储存y的地址。
在函数调用中,传递的是x,y的地址,那么a,b也分别储存x,y的地址,那么*a,*b即为x,y,交换*a,*b的值即为交换x,y的值。所以,通过函数和指针变量即可实现通过形参变量的值改变实参变量的值。