必備知識(shí):c語(yǔ)言中的函數(shù)調(diào)用和指針變量的相關(guān)知識(shí)
眾所周知,函數(shù)是C語(yǔ)言中一個(gè)十分重要的模塊以故,因?yàn)楹瘮?shù)的存在蜗细,使得C語(yǔ)言的可讀性、可維護(hù)性怒详、可移植性大大提高炉媒。因此,想要學(xué)好C語(yǔ)言昆烁,必須要學(xué)好函數(shù)吊骤。函數(shù)的一個(gè)功能就是傳遞數(shù)值進(jìn)行運(yùn)算,那么我們?nèi)绾卫煤瘮?shù)和指針變量通過(guò)形參變量的值改變實(shí)參變量的值呢静尼?
首先白粉,讓我們先舉一個(gè)例子。
#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恬口,但是值卻沒(méi)有按預(yù)期調(diào)換,為什么呢奔害?
這是因?yàn)楹瘮?shù)調(diào)用中楷兽,虛實(shí)結(jié)合傳遞的是變量的值比规,且為單向傳遞四敞,即實(shí)際參數(shù)向形式參數(shù)傳遞值亿乳,但是形式參數(shù)卻不能向?qū)嶋H參數(shù)傳遞值挥转。因此沽损,在上述的程序中鸽凶,雖然x的值12傳給了a李剖,y的值6傳給了b救崔,在被調(diào)用的函數(shù)func中扶供,a筛圆,b的值確實(shí)互換了,但是卻不能影響實(shí)參x椿浓,y的值太援。因此闽晦,在調(diào)用結(jié)束后,x提岔,y的值是不會(huì)變化的仙蛉。
下面,就開始引入今天的重頭戲--指針變量碱蒙。我們?nèi)匀煌ㄟ^(guò)一個(gè)程序來(lái)說(shuō)明荠瘪。
ps:不是我太懶,只是只有通過(guò)具體的程序才能更好的理解赛惩。
#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)用中季惯,虛實(shí)結(jié)合傳遞的仍然是變量的值阶牍,且為單向傳遞,卻仍能交換x星瘾,y的值走孽,why?
這就要?dú)w功于指針變量了!指針變量即為地址變量琳状,是儲(chǔ)存變量在內(nèi)存中地址的變量磕瓷。x_pointer=&x,y_pointer=&y即為使x_pointer儲(chǔ)存x的地址念逞,y_pointer儲(chǔ)存y的地址困食。
在函數(shù)調(diào)用中,傳遞的是x翎承,y的地址硕盹,那么a,b也分別儲(chǔ)存x叨咖,y的地址瘩例,那么*a,*b即為x甸各,y垛贤,交換*a,*b的值即為交換x趣倾,y的值聘惦。所以,通過(guò)函數(shù)和指針變量即可實(shí)現(xiàn)通過(guò)形參變量的值改變實(shí)參變量的值儒恋。