亚洲国产日韩欧美在线a乱码,国产精品路线1路线2路线,亚洲视频一区,精品国产自,www狠狠,国产情侣激情在线视频免费看,亚洲成年网站在线观看

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

時(shí)間:2025-11-10 11:33:54 C語(yǔ)言

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

  用C語(yǔ)言編寫(xiě)不同的函數(shù),函數(shù)返回的值是不一樣的。下面是小編為大家?guī)?lái)的關(guān)于C語(yǔ)言函數(shù)返回值解析的知識(shí),歡迎閱讀。

  程序一:

  int main()

  {

  int *p;

  int i;

  int*fun(void);

  p=fun();

  for(i=0;i<3;i++)

  {

  printf("%d ",*p);

  p++;

  }

  return 0;

  };

  int* fun(void)

  {

  static int str[]={1,2,3,4,5};

  int*q=str;

  return q;

  }

  /pic/p>

  雖然str是在動(dòng)態(tài)變量區(qū),而該動(dòng)態(tài)變量是局部的,函數(shù)結(jié)束時(shí)不保留的。

  程序二:

  int main()

  {

  char *p;

  char*fun(void);

  p=fun();

  printf("%s ",p);

  return 0;

  };

  char * fun(void)

  {

  char *str="hello";

  return str;

  }

  /pic/p>

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

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

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

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

  return 0;

  };

  /pic/pic/p>

  int fun(int a,int b)

  {

  int max;

  if(a>b)

  max=a;

  else

  max=b;

  return max;

  }

  /pic/p>

  程序三:

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

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

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

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

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

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

  程序四:

  int main()

  {

  char *p;

  char *fun(void);

  p=fun();

  printf("%x ",p);

  printf("%s ",p);

  return 0;

  }

  char* fun(void)

  {

  /pic/p>

  char str[]="hello";

  printf("%x ",str);

  return str;

  }

  /pic/p>

  char str[]="hello"; 是在動(dòng)態(tài)變量區(qū)中開(kāi)辟了可以容納6個(gè)字符的數(shù)組,數(shù)組名叫str。同時(shí)將字符串"hello"(原存放于常數(shù)空間)拷貝到這個(gè)數(shù)組空間中去作為數(shù)組的初始化值。

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

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

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

  【總結(jié)】

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

  (1)指向靜態(tài)(static)變量;

  (2)指向?qū)iT(mén)申請(qǐng)分配的(如用malloc)空間;

  (3)指向常量區(qū)(如指向字符串"hello");

  (4)指向全局變量;

  (5)指向程序代碼區(qū)(如指向函數(shù)的指針)。

  除這5項(xiàng)以外,其它怪技巧不提倡。

  函數(shù)內(nèi)的變量,沒(méi)有關(guān)鍵字static修飾的變量的生命周期只在本函數(shù)內(nèi),函數(shù)結(jié)束后變量自動(dòng)銷(xiāo)毀。當(dāng)返回為指針的時(shí)候需要特別注意,因?yàn)楹瘮?shù)結(jié)束后指針?biāo)赶虻牡刂芬廊淮嬖冢窃摰刂房梢员黄渌绦蛐薷,里面的?nèi)容就不確定了,有可能后面的操作會(huì)繼續(xù)用到這塊地址,有可能不會(huì)用到,所以會(huì)出現(xiàn)時(shí)對(duì)時(shí)錯(cuò)的情況,如果需要返回一個(gè)指針而又不出錯(cuò)的話只能調(diào)用內(nèi)存申請(qǐng)函數(shù)

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

  #include

  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 s1.b = %d s1.c = %d ",s1.a, s1.b, s1.c);

  printf("s2.a = %d s2.b = %d s2.c = %d ",s2.a, s2.b, s2.c);

  return 0;

  }

  /pic/p>


【C語(yǔ)言函數(shù)返回值解析】相關(guān)文章:

C語(yǔ)言函數(shù)的返回值08-18

C語(yǔ)言函數(shù)說(shuō)明與返回值11-05

C語(yǔ)言函數(shù)的參數(shù)和返回值09-15

C語(yǔ)言中friend友元函數(shù)詳細(xì)解析08-07

什么是C語(yǔ)言函數(shù)01-22

淺談C語(yǔ)言函數(shù)11-11

C語(yǔ)言的數(shù)組與函數(shù)02-28

C語(yǔ)言函數(shù)的定義03-07

C語(yǔ)言函數(shù)的含義09-30