必備知識:c語言中的函數(shù)調(diào)用和指針變量的相關(guān)知識
眾所周知,函數(shù)是C語言中一個十分重要的模塊,因為函數(shù)的存在,使得C語言的可讀性、可維護性、可移植性大大提高。因此,想要學(xué)好C語言,必須要學(xué)好函數(shù)。函數(shù)的一個功能就是傳遞數(shù)值進行運算,那么我們?nèi)绾卫煤瘮?shù)和指針變量通過形參變量的值改變實參變量的值呢?
首先,讓我們先舉一個例子。
#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)
//函數(shù)的功能若a>b,則調(diào)換a,b的值
{
int c;
if(a>b)
{
c=a;
a=b;
b=c;
}
}
結(jié)果:
分析:函數(shù)func的功能是若a>b,則調(diào)換a,b的值,而我們輸入的數(shù)為12,6,且12>6,但是值卻沒有按預(yù)期調(diào)換,為什么呢?
這是因為函數(shù)調(diào)用中,虛實結(jié)合傳遞的是變量的值,且為單向傳遞,即實際參數(shù)向形式參數(shù)傳遞值,但是形式參數(shù)卻不能向?qū)嶋H參數(shù)傳遞值。因此,在上述的程序中,雖然x的值12傳給了a,y的值6傳給了b,在被調(diào)用的函數(shù)func中,a,b的值確實互換了,但是卻不能影響實參x,y的值。因此,在調(diào)用結(jié)束后,x,y的值是不會變化的。
下面,就開始引入今天的重頭戲--指針變量。我們?nèi)匀煌ㄟ^一個程序來說明。
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)
//函數(shù)的功能若a>b,則調(diào)換a,b的值
{
int c;
if(*a>*b)
{
c=*a;
*a=*b;
*b=c;
}
}
結(jié)果:
上面的程序成功地交換了x,y的值,這是為什么呢?
上述函數(shù)調(diào)用中,虛實結(jié)合傳遞的仍然是變量的值,且為單向傳遞,卻仍能交換x,y的值,why?
這就要歸功于指針變量了!指針變量即為地址變量,是儲存變量在內(nèi)存中地址的變量。x_pointer=&x,y_pointer=&y即為使x_pointer儲存x的地址,y_pointer儲存y的地址。
在函數(shù)調(diào)用中,傳遞的是x,y的地址,那么a,b也分別儲存x,y的地址,那么*a,*b即為x,y,交換*a,*b的值即為交換x,y的值。所以,通過函數(shù)和指針變量即可實現(xiàn)通過形參變量的值改變實參變量的值。