Chinaunix首页 | 论坛 | 博客
  • 博客访问: 857299
  • 博文数量: 213
  • 博客积分: 5048
  • 博客等级: 大校
  • 技术积分: 1883
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-14 10:14
文章分类

全部博文(213)

文章存档

2011年(4)

2010年(55)

2009年(47)

2008年(107)

我的朋友

分类: C/C++

2008-10-28 21:27:57

int   testA   (void)  
  {  
  int   b   =   1   ;  
   
  return   b   ;  
  }  
   
  char   *   testB   (void)  
  {  
  char   str[]   =   "abc"   ;  
   
  return   str   ;  
  }  

int   main()  
  {  
  printf(   "   the   value   of   testA   is   %d   \n",   testA()   )   ;  
   
  printf(   "   the   value   of   testB   is   %c   ",   *(   testB()   )   )   ;  
   
  }  
对于返回值的情况:  
          testA与main函数同在栈区,testA结束时C++创建临时变量,然后将返回值复制给该临时  
  变量。  
          printf(   "   the   value   of   testA   is   %d   \n",   testA()   )   时输出的是该临时变量的值,testA中的b已经不存在。  
   
  对于返回指针的情况:  
          这是最复杂的部分。首先,对于上面的情形:返回一个数组的首地址,由于是返回char   *  
  类型,所以C++会首先创建一个char   *类型的临时变量,再把该数组的首地址赋给临时变量;  
  函数结束后该数组也就被销毁,这就意味着临时变量指向了一个“未声明的地址”,幸运的情况下,这段内存暂时还没有被其他的数据所覆盖,因此还能输出正确的内容。  
          在testB里面,如果换成char*   str="abc";return   str;   由于这时str指向的是全局数据区  
  的一段内存地址,所以函数结束后临时变量也指向该地址,所以编译器不会提出警告。但这样  
  的方法是不推荐的。  
   
  返回引用:  
          这中情况的效率最高,它直接返回一个对象,不产生返回值的副本。但同时也要注意避免  
  返回局部引用的情况。
阅读(1602) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~