- 相關(guān)推薦
C語(yǔ)言函數(shù)返回值解析
用C語(yǔ)言編寫(xiě)不同的函數(shù),函數(shù)返回的值是不一樣的。下面是小編為大家?guī)?lái)的關(guān)于C語(yǔ)言函數(shù)返回值解析的知識(shí),歡迎閱讀。
程序一:
int main()
{
int *p;
int i;
int*fun(void);
p=fun();
for(i=0;i<3;i++)
{
printf("%d ",*p);
p++;
}
return 0;
};
int* fun(void)
{
static int str[]={1,2,3,4,5};
int*q=str;
return q;
}
//不能正確返回
雖然str是在動(dòng)態(tài)變量區(qū),而該動(dòng)態(tài)變量是局部的,函數(shù)結(jié)束時(shí)不保留的。
程序二:
int main()
{
char *p;
char*fun(void);
p=fun();
printf("%s ",p);
return 0;
};
char * fun(void)
{
char *str="hello";
return str;
}
//可以正確返回
但是,字符串"hello"不是變量,而是一個(gè)常量,編譯程序在處理這種常量時(shí),通常把它放在了常量區(qū)中。而常量區(qū)則是始終存在的。
后一個(gè)例子中函數(shù)fun的返回值就是一個(gè)指向這種常量區(qū)的指針。
函數(shù)返回指針,要使主程序可以使用這個(gè)指針來(lái)訪問(wèn)有意義的數(shù)據(jù),關(guān)鍵就是要保證在使用這個(gè)指針值的時(shí)候,該指針?biāo)赶虻牡胤降臄?shù)據(jù)仍然有意義。
還有,如果指針是指向函數(shù)的指針,那么這個(gè)指針就是指向程序代碼區(qū)的。這也是一種應(yīng)用的情況。
另外,如果明白了它的原理,程序員還可以發(fā)明出一些其他靈活的使用方法,當(dāng)然,那都屬于“怪”方法,一般不提倡的。
程序三:
int main()
{
int a,b;
int max;
int fun (int a,int b);
scanf("%d%d",&a,&b);
max=fun (a,b);
printf(" %d ",max);
return 0;
};
//http://www.bianceng.cn
int fun(int a,int b)
{
int max;
if(a>b)
max=a;
else
max=b;
return max;
}
//可以正確返回
程序三:
這個(gè)例子中,返回的不是變量max的地址,返回的是它的值。
return后面的東西,看做一個(gè)表達(dá)式,返回的是這個(gè)表達(dá)式的值。
例如,入口如果a是3,b是5,則此時(shí)(執(zhí)行return語(yǔ)句時(shí))max里面存的是5。而return語(yǔ)句的功能就是把max里面的5取出來(lái),放到“返回值寄存器”中。
主程序是從“返回值寄存器”得到這個(gè)5的(此時(shí)max變量已經(jīng)不存在了)。
你前面的第二個(gè)例子中,同樣,指針變量str在函數(shù)結(jié)束后已經(jīng)不存在了。但是在return語(yǔ)句中,把指針變量str里面的值(等于字符串"hello"存放處的地址)送到“返回值寄存器”中了。
動(dòng)態(tài)變量str不存在了,但常量區(qū)中的字符串"hello"還存在。主程序根據(jù)返回的地址就可以找到該字符串。
程序四:
int main()
{
char *p;
char *fun(void);
p=fun();
printf("%x ",p);
printf("%s ",p);
return 0;
}
char* fun(void)
{
// char str[]={'a','b','c','d','e','f','