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

首頁 > 編程 > C > 正文

詳解C語言函數返回值解析

2020-01-26 14:03:39
字體:
來源:轉載
供稿:網友

詳解C語言函數返回值解析

程序一:

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;};//http://www.bianceng.cnint 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
欧美精品第一页在线播放| 亚洲深夜福利视频| 69av在线播放| 欧美精品电影免费在线观看| 色偷偷综合社区| 国产精品色婷婷视频| 欧美成人免费播放| 热久久99这里有精品| 国产v综合v亚洲欧美久久| 欧美视频在线观看免费| 精品一区二区三区四区在线| 欧美电影电视剧在线观看| 国产va免费精品高清在线观看| 91国产在线精品| 久久久亚洲网站| 亚洲欧美在线一区二区| 日韩av在线网| 日韩成人激情视频| 欧美日韩精品在线视频| 欧美成人sm免费视频| 成人精品一区二区三区电影免费| 国产在线98福利播放视频| 国产精品久久久久免费a∨大胸| 久久久久久中文字幕| 国产精品www网站| 欧美一级淫片播放口| 2019中文字幕免费视频| 国产精品久久久久久久久| 欧美激情乱人伦| 欧美亚洲日本黄色| 中文字幕免费精品一区| 亚洲精品成人网| 91精品国产免费久久久久久| 成人国产精品av| 在线观看精品自拍私拍| 国产一区二区三区丝袜| 亚洲成人网在线| 国产综合视频在线观看| 久久国产精品久久久| 国产亚洲一区二区在线| 色婷婷综合成人av| 欧美日韩一区二区在线播放| 国产一区二区三区在线观看视频| 久久久国产视频91| 亚洲欧美制服中文字幕| 日韩**中文字幕毛片| 久精品免费视频| 欧美精品在线网站| 欧美丰满老妇厨房牲生活| 亚洲成年人影院在线| 青草热久免费精品视频| www.国产精品一二区| 亚洲欧美国产一本综合首页| 国产97色在线| 欧美日韩亚洲视频| 夜夜嗨av色一区二区不卡| 奇米影视亚洲狠狠色| 久久综合色影院| 欧美性猛交99久久久久99按摩| 欧美久久精品午夜青青大伊人| 日韩欧美中文字幕在线观看| 欧美综合激情网| 日韩精品久久久久| 在线看欧美日韩| 亚洲最新av在线网站| 国内揄拍国内精品| 久久久亚洲精品视频| 午夜精品美女自拍福到在线| 在线观看亚洲视频| 欧美伦理91i| 精品久久久久久久大神国产| 日韩av影院在线观看| 亚洲国产精彩中文乱码av在线播放| 91国产视频在线播放| 97香蕉久久超级碰碰高清版| 色妞久久福利网| 日韩美女视频免费看| 国产精品日韩在线播放| 久久久最新网址| 国自产精品手机在线观看视频| 欧美日韩中国免费专区在线看| 日韩精品中文字幕在线观看| 色在人av网站天堂精品| 欧美亚洲激情在线| 久久久爽爽爽美女图片| 最新国产成人av网站网址麻豆| 日本高清久久天堂| 亚洲精品国产品国语在线| 亚洲色图综合网| 亚洲91av视频| 91免费国产视频| 亚洲区一区二区| 91精品国产免费久久久久久| 午夜精品免费视频| 亚洲一区二区三区乱码aⅴ| 日韩女优在线播放| 欧美日韩国产成人在线观看| 4k岛国日韩精品**专区| 神马久久桃色视频| 亚洲最大福利视频网站| 午夜精品三级视频福利| 成人欧美一区二区三区黑人孕妇| 国产91色在线播放| 一本色道久久88综合日韩精品| 在线午夜精品自拍| 91久久久久久久久| 亚洲人成自拍网站| 中文字幕日韩欧美在线| 国产亚洲精品久久久久动| 欧美韩国理论所午夜片917电影| 亚洲第一视频在线观看| 久久久久久久久久久人体| 在线观看国产成人av片| 91精品91久久久久久| 国产精品青草久久久久福利99| 国产欧美日韩高清| 午夜精品在线观看| 欧美黄色片免费观看| 久久男人av资源网站| 国产精品专区h在线观看| 亚洲欧美制服丝袜| 亚洲国产美女精品久久久久∴| 亚洲视频axxx| 亚洲系列中文字幕| 丝袜美腿亚洲一区二区| 日本欧美一级片| 久久精品国产一区二区电影| 国产精品偷伦一区二区| 国产精品一区二区三区久久| 久久久亚洲影院你懂的| 亚洲视频在线视频| 亚洲精品中文字幕有码专区| 久久99热精品这里久久精品| 懂色aⅴ精品一区二区三区蜜月| 自拍偷拍亚洲精品| 国产精品看片资源| 国产丝袜一区二区三区| 国产精品视频1区| 亚洲人成五月天| 欧美中文字幕视频| 色伦专区97中文字幕| 在线看日韩av| 亚洲一区久久久| 亚洲一区二区三区四区在线播放| 久久91亚洲精品中文字幕| 亚洲成年人在线| 欧美视频裸体精品| 亚洲品质视频自拍网| 色婷婷久久av| 成人精品视频久久久久| 久久精品人人爽| 国产欧美一区二区三区四区| 国产精品国语对白| 日韩中文在线不卡| 亚洲第一区中文字幕| 欧美一级电影免费在线观看| 精品国偷自产在线视频| 欧美极品美女电影一区| 久久色免费在线视频| 国产精品黄色影片导航在线观看| 日本19禁啪啪免费观看www| 欧美激情国产日韩精品一区18| 在线播放国产一区中文字幕剧情欧美| 日本在线精品视频|