最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C語言函數(shù)返回值解析

 更新時間:2017年06月25日 09:39:48   投稿:lqh  
這篇文章主要介紹了詳解C語言函數(shù)返回值解析的相關(guān)資料,需要的朋友可以參考下

詳解C語言函數(shù)返回值解析

程序一:

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是在動態(tài)變量區(qū),而該動態(tài)變量是局部的,函數(shù)結(jié)束時不保留的。

程序二:

int main()

{

  char *p;

  char*fun(void);

  p=fun();

  printf("%s\n",p);

  return 0;

};

char * fun(void)

{

  char *str="hello";

  return str;

}


//可以正確返回

但是,字符串"hello"不是變量,而是一個常量,編譯程序在處理這種常量時,通常把它放在了常量區(qū)中。而常量區(qū)則是始終存在的。

后一個例子中函數(shù)fun的返回值就是一個指向這種常量區(qū)的指針。

函數(shù)返回指針,要使主程序可以使用這個指針來訪問有意義的數(shù)據(jù),關(guān)鍵就是要保證在使用這個指針值的時候,該指針?biāo)赶虻牡胤降臄?shù)據(jù)仍然有意義。

還有,如果指針是指向函數(shù)的指針,那么這個指針就是指向程序代碼區(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("\n%d\n",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;

}

//可以正確返回

程序三:

這個例子中,返回的不是變量max的地址,返回的是它的值。

return后面的東西,看做一個表達(dá)式,返回的是這個表達(dá)式的值。

例如,入口如果a是3,b是5,則此時(執(zhí)行return語句時)max里面存的是5。而return語句的功能就是把max里面的5取出來,放到“返回值寄存器”中。

主程序是從“返回值寄存器”得到這個5的(此時max變量已經(jīng)不存在了)。

你前面的第二個例子中,同樣,指針變量str在函數(shù)結(jié)束后已經(jīng)不存在了。但是在return語句中,把指針變量str里面的值(等于字符串"hello"存放處的地址)送到“返回值寄存器”中了。

動態(tài)變量str不存在了,但常量區(qū)中的字符串"hello"還存在。主程序根據(jù)返回的地址就可以找到該字符串。

程序四:

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"; 是在動態(tài)變量區(qū)中開辟了可以容納6個字符的數(shù)組,數(shù)組名叫str。同時將字符串"hello"(原存放于常數(shù)空間)拷貝到這個數(shù)組空間中去作為數(shù)組的初始化值。

此時若執(zhí)行return str; 其中的str是數(shù)組名。C語言規(guī)定,表達(dá)式中如果是數(shù)組名,則該表達(dá)式的值就等于這個數(shù)組的地址。所以返回的是這個數(shù)組的地址,請注意:并不是字符串常量"hello"的地址!而函數(shù)結(jié)束時,雖然常數(shù)空間并不破壞,但這個數(shù)組空間是破壞了的,而你返回的卻不是常數(shù)空間里的地址而正是已經(jīng)破壞了的數(shù)組的地址。

而char *str="hello"; 是在動態(tài)變量區(qū)中開辟了一個可以存放一個指針值的變量,名叫str。同時將原存放于常數(shù)空間的字符串"hello"的地址賦給這個指針變量作為初始值。

此時若執(zhí)行return str; 其中的str是指針變量名。C語言規(guī)定,表達(dá)式中如果是變量名,則該表達(dá)式的值就等于這個變量的值(指針變量的值就是地址)。所以返回的是變量str的值,而變量str的值就等于字符串常量"hello"的地址。而函數(shù)結(jié)束時,變量str破壞了的,但常數(shù)空間中的字符串并不破壞。主程序根據(jù)返回的地址就可以找到該字符串。

【總結(jié)】

常規(guī)程序中,函數(shù)返回的指針通常應(yīng)該是:

(1)指向靜態(tài)(static)變量;
(2)指向?qū)iT申請分配的(如用malloc)空間;
(3)指向常量區(qū)(如指向字符串"hello");
(4)指向全局變量;
(5)指向程序代碼區(qū)(如指向函數(shù)的指針)。

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

函數(shù)內(nèi)的變量,沒有關(guān)鍵字static修飾的變量的生命周期只在本函數(shù)內(nèi),函數(shù)結(jié)束后變量自動銷毀。當(dāng)返回為指針的時候需要特別注意,因為函數(shù)結(jié)束后指針?biāo)赶虻牡刂芬廊淮嬖?,但是該地址可以被其他程序修改,里面的?nèi)容就不確定了,有可能后面的操作會繼續(xù)用到這塊地址,有可能不會用到,所以會出現(xiàn)時對時錯的情況,如果需要返回一個指針而又不出錯的話只能調(diào)用內(nèi)存申請函數(shù)

返回結(jié)構(gòu)體:

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

}


//可以返回

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • C++實現(xiàn)LeetCode(51.N皇后問題)

    C++實現(xiàn)LeetCode(51.N皇后問題)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(51.N皇后問題),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言實現(xiàn)BMP格式圖片轉(zhuǎn)化為灰度

    C語言實現(xiàn)BMP格式圖片轉(zhuǎn)化為灰度

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)BMP格式圖片轉(zhuǎn)化為灰度,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++ 實現(xiàn)哈希表的實例

    C++ 實現(xiàn)哈希表的實例

    這篇文章主要介紹了C++ 實現(xiàn)哈希表的實例的相關(guān)資料,這里使用C++實現(xiàn)哈希表的實例幫助大家徹底理解哈希表的原理,需要的朋友可以參考下
    2017-08-08
  • 詳解C語言中的ttyname()函數(shù)和isatty()函數(shù)的用法

    詳解C語言中的ttyname()函數(shù)和isatty()函數(shù)的用法

    這篇文章主要介紹了C語言中的ttyname()函數(shù)和isatty()函數(shù)的用法,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • C++中的auto_ptr智能指針的作用及使用方法詳解

    C++中的auto_ptr智能指針的作用及使用方法詳解

    這篇文章主要介紹了C++中的auto_ptr智能指針的作用及使用方法詳解的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • C++實現(xiàn)拼圖游戲代碼(graphics圖形庫)

    C++實現(xiàn)拼圖游戲代碼(graphics圖形庫)

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)拼圖游戲代碼,帶有g(shù)raphics圖形庫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • VisualStudio 使用Visual Leak Detector檢查內(nèi)存泄漏

    VisualStudio 使用Visual Leak Detector檢查內(nèi)存泄漏

    這篇文章主要介紹了VisualStudio 使用Visual Leak Detector檢查內(nèi)存泄漏的相關(guān)資料,需要的朋友可以參考下
    2015-07-07
  • C++中std::construct()與std::destroy()的使用

    C++中std::construct()與std::destroy()的使用

    std::construct()和std::destroy()是C++ STL中的函數(shù)模板,用于在已分配的存儲區(qū)域中構(gòu)造或銷毀對象,本文主要介紹了C++中std::construct()與std::destroy()的使用,感興趣的可以了解一下
    2024-02-02
  • C語言實現(xiàn)騎士飛行棋小游戲

    C語言實現(xiàn)騎士飛行棋小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)騎士飛行棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • VScode上配置 c語言環(huán)境的圖文教程

    VScode上配置 c語言環(huán)境的圖文教程

    這篇文章主要介紹了配置VScode c語言環(huán)境,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05

最新評論

河曲县| 偏关县| 松原市| 西贡区| 襄樊市| 巴东县| 修文县| 昭平县| 石城县| 宁武县| 永清县| 佳木斯市| 庆元县| 徐水县| 霍山县| 鸡西市| 平凉市| 吉林省| 名山县| 澜沧| 汶上县| 集贤县| 镇远县| 临安市| 洛隆县| 同德县| 梅河口市| 晋宁县| 多伦县| 尚志市| 奉化市| 如东县| 浦城县| 夹江县| 灵寿县| 尖扎县| 琼结县| 桑植县| 宜昌市| 赣榆县| 达拉特旗|