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

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

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

2019-11-11 04:57:00
字體:
來源:轉載
供稿:網友

程序一:

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
亚洲精品网站在线播放gif| 亚洲精品视频播放| 亚洲аv电影天堂网| 国产精品91在线| 亚洲黄色在线看| 久久国产加勒比精品无码| 午夜精品久久17c| 欧美性受xxxx白人性爽| 亚洲成人网久久久| 欧美亚洲国产日韩2020| 国产视频精品va久久久久久| 亚洲免费高清视频| 国产精品对白刺激| 亚洲人成网站色ww在线| 色婷婷综合成人av| 精品丝袜一区二区三区| 欧美国产精品人人做人人爱| 亚洲综合中文字幕68页| 精品国产乱码久久久久久婷婷| y97精品国产97久久久久久| 日韩精品一二三四区| 国产成人91久久精品| 亚洲摸下面视频| 国产精品色婷婷视频| 亚洲成人黄色在线观看| 欧美大片免费观看在线观看网站推荐| 亚洲电影免费观看高清完整版在线观看| 在线播放日韩精品| 国内精久久久久久久久久人| 91国偷自产一区二区三区的观看方式| 亚洲国产精品大全| 热久久免费视频精品| 奇米成人av国产一区二区三区| 日本欧美国产在线| 91禁国产网站| 国产自产女人91一区在线观看| 一道本无吗dⅴd在线播放一区| 亚洲情综合五月天| 国产成人免费av电影| 精品亚洲国产成av人片传媒| 欧洲精品毛片网站| 久久精品成人欧美大片| 久久视频国产精品免费视频在线| 精品香蕉一区二区三区| 疯狂蹂躏欧美一区二区精品| 欧美久久精品一级黑人c片| 国产精品人成电影| 国产精品99蜜臀久久不卡二区| 欧美大片在线免费观看| 中文字幕亚洲图片| 欧美激情一级欧美精品| 久久精品成人欧美大片古装| 国产精品一二三在线| 国产精品美女呻吟| 国产精品三级在线| 5252色成人免费视频| 少妇精69xxtheporn| 亚洲一区亚洲二区| 久久精品国产精品| 91久久精品日日躁夜夜躁国产| 懂色aⅴ精品一区二区三区蜜月| 国产在线视频欧美| 久久精彩免费视频| 国产丝袜视频一区| 欧日韩不卡在线视频| 亚洲第一中文字幕在线观看| 成人疯狂猛交xxx| 国产成人精品最新| 成人国产精品色哟哟| 欧美精品www| 国产精品免费电影| 91成人福利在线| 欧美激情亚洲视频| 国产精品久久久久7777婷婷| 国产精品678| 97精品国产91久久久久久| 亚洲天堂精品在线| 国产精品香蕉国产| 国产成人jvid在线播放| 久久国产一区二区三区| 成人免费在线视频网站| 欧美二区乱c黑人| 欧美日韩亚洲国产一区| 中文字幕欧美专区| 日韩在线观看高清| 伊人久久久久久久久久久久久| 国产日产欧美a一级在线| 国产精品日韩一区| 欧美日韩精品在线| 欧美一级大胆视频| 国内精品久久久| 一道本无吗dⅴd在线播放一区| 亚洲а∨天堂久久精品9966| 国产精品爽爽ⅴa在线观看| 97视频免费观看| 国产偷亚洲偷欧美偷精品| 亚洲天堂色网站| 国产精品成人观看视频国产奇米| 国产日韩欧美日韩大片| 亚洲aa中文字幕| 国产第一区电影| 成人国产精品色哟哟| 日本成人激情视频| 日韩欧美在线播放| 欧美国产日韩一区二区三区| 日韩电影免费在线观看| 欧美肥婆姓交大片| 国产精品久久久久久av福利软件| 欧美国产精品人人做人人爱| 欧美日韩人人澡狠狠躁视频| 国产成人精品久久二区二区| 国产精品免费一区| 日韩日本欧美亚洲| 成人性教育视频在线观看| 欧美影院成年免费版| 久久久久国产精品www| 亚洲国产91精品在线观看| 一区二区三区精品99久久| 日韩经典中文字幕| 81精品国产乱码久久久久久| 欧美午夜性色大片在线观看| 欧美又大又硬又粗bbbbb| 国产+成+人+亚洲欧洲| 91牛牛免费视频| 国产亚洲欧美日韩一区二区| 日韩黄色高清视频| 久久久天堂国产精品女人| 欧美激情伊人电影| 欧美视频专区一二在线观看| 欧美xxxx18国产| 国产精品旅馆在线| 亚洲国产精品高清久久久| 38少妇精品导航| 国产精品国产三级国产专播精品人| 九九久久久久久久久激情| 91在线直播亚洲| 欧美男插女视频| 国产精品扒开腿做爽爽爽视频| 成人欧美一区二区三区黑人| 欧美中文在线观看国产| 国模精品视频一区二区三区| 欧美日韩性生活视频| 久久久久999| 久久久噜噜噜久久久| 成人免费看片视频| 在线观看欧美成人| 欧美尤物巨大精品爽| 两个人的视频www国产精品| 欧美极品少妇与黑人| 国产精品欧美久久久| 91久久精品国产91久久性色| 国产精品白嫩初高中害羞小美女| 国产丝袜一区视频在线观看| 欧美成人精品xxx| 九九精品视频在线观看| 成人h视频在线观看播放| 欧美性做爰毛片| 97国产真实伦对白精彩视频8| 欧美日韩亚洲视频一区| 亚洲国产成人久久| 亚洲精品国产精品国自产观看浪潮| 久久夜色撩人精品| 国产亚洲成av人片在线观看桃| 日韩电影中文字幕一区|