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

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

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

2019-11-11 03:45:43
字體:
來源:轉載
供稿:網友

程序一:

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;   }

//可以返回


上一篇:獨木橋 洛谷1007 模擬

下一篇:凌亂的yyy

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美疯狂性受xxxxx另类| 中文字幕av一区二区| 亚洲图片欧洲图片av| 欧美日产国产成人免费图片| 国产欧美欧洲在线观看| 欧美国产日韩一区| 欧美国产日韩精品| 久久福利视频导航| www国产亚洲精品久久网站| 色哟哟网站入口亚洲精品| 亚洲精品第一国产综合精品| 国产丝袜一区二区| 一本一道久久a久久精品逆3p| 久久久久久中文字幕| 亚洲精品久久久久中文字幕二区| 在线视频免费一区二区| 亚洲国产欧美一区二区三区久久| 中文字幕日韩专区| 在线国产精品播放| 欧美精品在线免费| 欧美一区二区三区免费观看| 久久久久久亚洲| 国产精品视频自在线| 精品国产一区二区三区久久久狼| 欧洲日韩成人av| 日韩专区中文字幕| 欧美日韩性视频| 麻豆乱码国产一区二区三区| 国产伊人精品在线| 国产一区二区三区精品久久久| 久久久久久久香蕉网| 亚洲91av视频| 日韩av一区在线| 欧美精品久久久久久久久久| 热久久视久久精品18亚洲精品| 亚洲第一区中文99精品| 久久人体大胆视频| 亚洲精品视频在线观看视频| 欧美另类老女人| 成人黄色激情网| 最近2019中文字幕在线高清| 欧美精品一本久久男人的天堂| 国产精品免费小视频| 亚洲毛片在线免费观看| 久久久亚洲影院| 欧美影院成年免费版| 国产精品久久久久久久久久久久久| 国产欧美日韩中文字幕在线| 欧美日韩亚洲高清| 精品中文字幕视频| 欧美性猛交xxxx乱大交3| 久久国产精品偷| 亚洲欧美激情四射在线日| 欧美午夜无遮挡| 国产精品老女人视频| 在线观看国产欧美| 中文字幕亚洲天堂| 国产精品久久电影观看| 国产日韩欧美在线播放| 欧美夜福利tv在线| 大荫蒂欧美视频另类xxxx| 日韩av不卡电影| 亚洲第一精品夜夜躁人人躁| 91精品啪aⅴ在线观看国产| 中文字幕亚洲一区在线观看| 亚洲免费电影一区| 4k岛国日韩精品**专区| 久久人人爽亚洲精品天堂| 中文字幕在线日韩| 欧美成人四级hd版| 日韩精品有码在线观看| 国产色综合天天综合网| 亚洲免费伊人电影在线观看av| 日本久久久久久| 久久伊人精品一区二区三区| 亚洲精品乱码久久久久久金桔影视| 亚洲护士老师的毛茸茸最新章节| 成人精品网站在线观看| 国产精品久久久久久搜索| 免费97视频在线精品国自产拍| 国产精品美女主播| 亚洲少妇中文在线| 日本成人黄色片| 欧美精品在线极品| 欧美午夜宅男影院在线观看| 精品久久久久久| 久久夜精品va视频免费观看| 亚洲精品成人久久久| 久久综合免费视频| 精品久久久久久国产91| 亚洲亚裔videos黑人hd| 久久久精品视频在线观看| 动漫精品一区二区| 国产第一区电影| 国产精品7m视频| 法国裸体一区二区| 欧美极品美女视频网站在线观看免费| 亚洲女同精品视频| 色99之美女主播在线视频| www.国产精品一二区| 欧美精品成人91久久久久久久| 日本19禁啪啪免费观看www| 亚洲成人久久一区| 日韩激情视频在线| 亚洲激情成人网| 欧美激情一级精品国产| 91久热免费在线视频| 日本一区二区三区四区视频| 亚洲尤物视频网| 成人免费看黄网站| 一区二区三区久久精品| 亚洲精品资源美女情侣酒店| 国产精品精品视频| 亚洲欧洲av一区二区| 欧洲成人在线观看| 亚洲欧美制服丝袜| 一区二区三区视频免费在线观看| 国产精品成人一区二区三区吃奶| 自拍偷拍亚洲精品| 亚洲欧美日韩国产中文| 亚洲老板91色精品久久| 日本精品视频网站| 日韩中文视频免费在线观看| 亚洲午夜精品视频| 91在线无精精品一区二区| 亚洲国产精品系列| 欧美有码在线观看视频| 国产精品高潮在线| 欧美精品videosex极品1| 欧美性猛交xxxx免费看久久久| 91天堂在线视频| 久久亚洲欧美日韩精品专区| 91免费欧美精品| 国产成人拍精品视频午夜网站| 视频在线观看99| 欧美成人性色生活仑片| 亚洲香蕉在线观看| 精品高清美女精品国产区| 亚洲性猛交xxxxwww| 日韩精品免费看| 4388成人网| 中文字幕日韩欧美| 欧美黑人又粗大| 91久久在线视频| 亚洲精品中文字幕有码专区| 国产精品亚洲一区二区三区| 欧美高跟鞋交xxxxhd| 国产精品视频xxxx| 在线精品播放av| 久久天天躁狠狠躁夜夜躁| 91中文字幕在线| 91av视频在线免费观看| 欧美日韩国产va另类| 日韩有码片在线观看| 精品国产91久久久| 国产日韩欧美在线| 91爱爱小视频k| 国产精品一区二区三区久久久| 欧美视频在线观看 亚洲欧| 欧美激情a∨在线视频播放| 欧美黑人视频一区| 国产suv精品一区二区三区88区| 欧美成人性色生活仑片| 在线看欧美日韩|