亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

關于C語言函數返回值問題

2019-11-11 03:20:26
字體:
來源:轉載
供稿:網友

程序一:

int main(){    int *p;    int i;    int*fun(void);    p=fun();    for(i=0;i<3;i++)    {        PRintf("%d/n",*p);        p++;         }    return 0;};int* fun(void){    static int str[]={1,2,3,4,5};     int*q=str;    return q;}

//不能正確返回雖然str是在動態變量區,而該動態變量是局部的,函數結束時不保留的。

程序二:

int main(){    char *p;    char*fun(void);    p=fun();    printf("%s/n",p);    return 0;};char * fun(void){    char *str="hello";    return str;}

//可以正確返回

但是,字符串"hello"不是變量,而是一個常量,編譯程序在處理這種常量時,通常把它放在了常量區中。而常量區則是始終存在的。后一個例子中函數fun的返回值就是一個指向這種常量區的指針。函數返回指針,要使主程序可以使用這個指針來訪問有意義的數據,關鍵就是要保證在使用這個指針值的時候,該指針所指向的地方的數據仍然有意義。還有,如果指針是指向函數的指針,那么這個指針就是指向程序代碼區的。這也是一種應用的情況。另外,如果明白了它的原理,程序員還可以發明出一些其他靈活的使用方法,當然,那都屬于“怪”方法,一般不提倡的。 

程序三:

int main(){    int a,b;    int max;    int fun (int a,int b);        scanf("%d%d",&a,&b);    max=fun (a,b);    printf("/n%d/n",max);    return 0;};int fun(int a,int b){    int max;    if(a>b)        max=a;    else         max=b;    return max;}//可以正確返回

程序三:

這個例子中,返回的不是變量max的地址,返回的是它的值。return后面的東西,看做一個表達式,返回的是這個表達式的值。例如,入口如果a是3,b是5,則此時(執行return語句時)max里面存的是5。而return語句的功能就是把max里面的5取出來,放到“返回值寄存器”中。主程序是從“返回值寄存器”得到這個5的(此時max變量已經不存在了)。你前面的第二個例子中,同樣,指針變量str在函數結束后已經不存在了。但是在return語句中,把指針變量str里面的值(等于字符串"hello"存放處的地址)送到“返回值寄存器”中了。動態變量str不存在了,但常量區中的字符串"hello"還存在。主程序根據返回的地址就可以找到該字符串。

程序四:

int main(){    char *p;    char *fun(void);    p=fun();    printf("%x/n",p);    printf("%s/n",p);    return 0;}char* fun(void){//    char str[]={'a','b','c','d','e','f','/0'};    char str[]="hello";    printf("%x/n",str);    return str;}//不能正確返回

char str[]="hello"; 是在動態變量區中開辟了可以容納6個字符的數組,數組名叫str。同時將字符串"hello"(原存放于常數空間)拷貝到這個數組空間中去作為數組的初始化值。此時若執行return str; 其中的str是數組名。C語言規定,表達式中如果是數組名,則該表達式的值就等于這個數組的地址。所以返回的是這個數組的地址,請注意:并不是字符串常量"hello"的地址!而函數結束時,雖然常數空間并不破壞,但這個數組空間是破壞了的,而你返回的卻不是常數空間里的地址而正是已經破壞了的數組的地址。而char *str="hello"; 是在動態變量區中開辟了一個可以存放一個指針值的變量,名叫str。同時將原存放于常數空間的字符串"hello"的地址賦給這個指針變量作為初始值。此時若執行return str; 其中的str是指針變量名。C語言規定,表達式中如果是變量名,則該表達式的值就等于這個變量的值(指針變量的值就是地址)。所以返回的是變量str的值,而變量str的值就等于字符串常量"hello"的地址。而函數結束時,變量str破壞了的,但常數空間中的字符串并不破壞。主程序根據返回的地址就可以找到該字符串。

【總結】常規程序中,函數返回的指針通常應該是:(1)指向靜態(static)變量;(2)指向專門申請分配的(如用malloc)空間;(3)指向常量區(如指向字符串"hello");(4)指向全局變量;(5)指向程序代碼區(如指向函數的指針)。 

除這5項以外,其它怪技巧不提倡。

函數內的變量,沒有關鍵字static修飾的變量的生命周期只在本函數內,函數結束后變量自動銷毀。當返回為指針的時候需要特別注意,因為函數結束后指針所指向的地址依然存在,但是該地址可以被其他程序修改,里面的內容就不確定了,有可能后面的操作會繼續用到這塊地址,有可能不會用到,所以會出現時對時錯的情況,如果需要返回一個指針而又不出錯的話只能調用內存申請函數

返回結構體:

#include <stdio.h>typedef struct {            int a;            int b;            int c;        }str;str change(str s){    s.a += 1;    s.b += 1;    s.c += 1;    return s;}int main(void){    str s1, s2;    s1.a = 1;    s1.b = 1;    s1.c = 1;    s2 = change(s1);    printf("s1.a = %d/ts1.b = %d/ts1.c = %d/n",s1.a, s1.b, s1.c);    printf("s2.a = %d/ts2.b = %d/ts2.c = %d/n",s2.a, s2.b, s2.c);    return 0;   }

//可以返回


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产999精品久久久影片官网| 91久久精品国产91性色| 欧美性xxxxxxx| 欧美剧在线观看| 国产一区二区三区在线播放免费观看| 国产成人短视频| 国产亚洲aⅴaaaaaa毛片| 欧美放荡办公室videos4k| 久久这里只有精品视频首页| 亚洲成人在线视频播放| 久久精品99无色码中文字幕| 亚洲欧美国产一本综合首页| 亚洲深夜福利网站| 中文字幕精品一区久久久久| 亚洲精品国产电影| 亚洲a在线观看| www.久久撸.com| 在线亚洲男人天堂| 国产精品久久综合av爱欲tv| 亚洲一区二区在线播放| 69久久夜色精品国产69| 少妇精69xxtheporn| 国产成人aa精品一区在线播放| 国产精品黄视频| 亚洲aⅴ日韩av电影在线观看| 久久久久久久久综合| 精品福利樱桃av导航| 亚洲精选中文字幕| 日韩精品视频在线观看免费| 国产欧洲精品视频| 国产美女精品免费电影| 国产欧美亚洲视频| www.久久草.com| 2024亚洲男人天堂| 欧美日韩成人在线播放| 亚洲欧美中文字幕| 久久精品这里热有精品| 久久影院资源站| 国产精品爱啪在线线免费观看| 91亚洲永久免费精品| 欧美激情精品在线| 国产99久久精品一区二区| 日韩美女在线观看一区| 青草青草久热精品视频在线观看| 亚洲精品永久免费| 久久综合久中文字幕青草| 欧美高清电影在线看| 欧美激情亚洲视频| 国产精品丝袜高跟| 国产精品女主播视频| 亚洲日本欧美中文幕| 日韩av在线免费观看一区| 中文字幕少妇一区二区三区| 国产免费一区二区三区香蕉精| 日韩大片免费观看视频播放| 亚洲欧洲在线观看| 亚洲综合大片69999| 亚洲人线精品午夜| 91av视频导航| 亚洲欧美日韩国产精品| 97免费视频在线| 日韩av在线影院| 日韩欧美中文在线| 国产精品18久久久久久首页狼| 91久久久久久久久久久久久| 欧美日韩成人精品| 亚洲黄色有码视频| 欧美乱大交xxxxx另类电影| 日韩视频在线免费| 在线观看精品自拍私拍| 亚洲精品免费一区二区三区| 国产精品白嫩美女在线观看| 欧美性xxxx极品hd欧美风情| 亚洲日本成人女熟在线观看| 日韩激情视频在线播放| 欧美亚洲第一页| 91精品综合久久久久久五月天| 精品露脸国产偷人在视频| 亚洲丁香婷深爱综合| 欧美在线观看一区二区三区| 亚洲自拍另类欧美丝袜| 国产精品激情av在线播放| 亚洲国产精品久久久久秋霞蜜臀| 欧美一级电影久久| 亚洲爱爱爱爱爱| 亚洲成人1234| 国产精品亚洲自拍| 成人欧美一区二区三区黑人| 国产999精品久久久| 亚洲国产精品va在线看黑人动漫| 国产精品com| 欧美一级淫片播放口| 懂色aⅴ精品一区二区三区蜜月| 亚洲成人网在线| 久久999免费视频| 国产精品成人av在线| 成人激情电影一区二区| 亚洲精品www久久久| 亚洲xxxx18| 亚洲国产精品久久久久秋霞蜜臀| 亚洲精品视频免费| 亚洲第一区第一页| 欧美在线一级va免费观看| 亚洲国产成人精品久久久国产成人一区| 国产精品久久久久久久久久久久久| 91久久在线播放| 国产午夜一区二区| 亚洲国产成人精品一区二区| 国产视频丨精品|在线观看| 热草久综合在线| 日韩一区二区三区xxxx| 日韩性xxxx爱| 欧美精品一二区| 韩国v欧美v日本v亚洲| 国产精品专区一| 亚洲一级一级97网| 国产一区二区三区四区福利| 亚洲国产小视频| 亚洲xxxxx电影| 精品视频一区在线视频| 黄色精品一区二区| 日韩av中文字幕在线播放| 精品国产一区二区三区久久久| 欧美日韩精品国产| 亚洲自拍高清视频网站| 在线观看国产欧美| 久久久久久香蕉网| 久久久噜噜噜久久久| 久久69精品久久久久久国产越南| 国产精品第三页| 一区二区三区美女xx视频| 国产亚洲欧美日韩精品| 国产一区二区在线播放| 91高潮在线观看| 日韩在线观看成人| 久久香蕉国产线看观看网| 国产精品爽爽爽爽爽爽在线观看| 欧美理论电影在线播放| 久久久亚洲福利精品午夜| 亚洲va久久久噜噜噜| 亚洲最大福利视频网站| 亚洲精品久久久久国产| 爱福利视频一区| 久久久久免费精品国产| 一区二区三区在线播放欧美| 欧美日韩中文字幕在线视频| 亚洲老司机av| 亚洲性av网站| 国产精品久在线观看| 日韩精品在线免费| 91干在线观看| 91久久嫩草影院一区二区| 51ⅴ精品国产91久久久久久| 欧美野外wwwxxx| 国产婷婷色综合av蜜臀av| 91极品视频在线| 97在线视频免费播放| 国产999在线| 亚洲色图35p| 亚洲最大激情中文字幕| 亚洲精品成人免费| 欧美主播福利视频| 精品国产31久久久久久| 久久精品一偷一偷国产|