关闭

当函数中返回值为值,指针,引用时,是如何带出和接收的?

标签: 指针class引用返回值
2508人阅读 评论(0) 收藏 举报
分类:

首先我们需要知道的是,当返回一个值,指针,引用时(小于八个字节均可以由寄存器带出)

需要注意的是,由于举例,下面的例子中返回了局部变量的地址,而这是有风险的,不能返回临时的局部的地址或引用。仅供思路分析的参考

1.返回内置类型的值,引用,指针,分别用指针,值,引用接收的情况。

1)通过寄存器返回一个值
这里写图片描述
2)通过寄存器带出,返回一个指针。
这里写图片描述
3)返回引用时需要解引用,返回指针时只需要返回一个地址,
这里写图片描述
4)由于是寄存器返回的值不可取地址,而定义引用变量的右边必须可取地址,如果非要使用引用就需要使用常引用。不能用一个指针接受这个函数的返回值。这个例子是错误的。
这里写图片描述
5)
返回了一个整型值,用引用接收。
常引用在函数调用完成后产生临时量。
临时量存放在dword[ebp-8]处。
这里写图片描述
6)通过常指针引用来引用一个寄存器返回的地址,会产生一个临时量。
这里写图片描述
7)返回一个引用时,返回的时候寄存器带回的是地址,在主函数栈帧时,会自动解引用。那么引用就是引用了value这个变量。value可取地址。
这里写图片描述
也可以写成int *p =&GetIntRef();
p指向的是value的地址。

2.返回自定义类型的值,引用,指针,分别用指针,值,引用接收的情况。

/****自定义类型返回值时才会产生临时量。返回指针不会产生临时量,返回引用的时候,它自身会解引用****/

//返回自定义类型的值时,分别用指针,值,引用来接收的情况

//自定义一个类型DATA
typedef struct _DATA
{
  int a;
}DATA;

DATA GetData()
{
   DATA data={10};
   return data;
}

int main()
{
   //正确,返回值由寄存器带回的
   DATA ret1=GetData();

  //正确,这里要注意,虽然通过寄存器带回,这里返回的是自定义类型的值,引用时编译器会自动产生一个临时量,而内置类型不可以
   DATA &ret2=GetData();

   //VC认为不能指向自定义类型返回的(取地址在先,临时量在后),而vs和gcc均支持指针指向自定义类型寄存器带出的返回值 (当然VC是相对比较老的编译器,我们以VS和gcc为准,这是正确的)
   DATA *ret3=&GetData();

   return 0;
}

//返回自定义类型的指针时,分别用指针,引用来接收的情况
typedef struct _DATA
{
  int a;
}DATA;

DATA* GetDataPtr()
{
   static DATA data={10};
   return &data;
}

int main()
{
    //可以
   DATA *ret1=&GetDataPtr();

   //不可以,返回指针时,跟类型无关,指针跟编译器位数有关,指针永远通过寄存器返回,引用时使用常引用
   DATA *&ret2=GetDataPtr();
   return 0;
}

//返回自定义类型的引用时,分别用指针,引用来接收的情况
typedef struct _DATA
{
  int a;
}DATA;

DATA& GetDataPtr()
{
   static DATA data={10};
   return data;
}
int main()
{
    //可以,这里引用的是寄存器带回的解引用之后的变量值
   DATA &ret1=GetDataPtr();

   //可以
   DATA *ret2=&GetDataPtr();

   //不可以,这里等式右边的是寄存器带回的是一个常量,需要用const引用
   DATA *&ret3=&GetDataPtr();
   //const引用
   DATA *const &ret3=&GetDataPtr()
   return 0;
}

int *& GetIntPtr()//错误 ,能不能返回引用就看return之后的是否可取地址
{
  static int value=10;
  return &value;//寄存器带回的一个地址
}

int *const& GetIntPtr()//正确  返回常引用
{
  static int value=10;
  return &value;
}

int*& GetIntPtr()//正确
{
  static int value=10;
  static int *ptr=&value;
  return ptr; //可取地址
}

DATA *GetDataPtr()
{
   static DATA data={10};
   return &data;
}

int main()
{

  return 0;
}
0
1
查看评论

关于函数返回值为指针类型的分析

先看一个例子,这是初学者经常遇到的问题 char *GetString(void) {  char p[] = "hello world";  return p; //编译器一般将提出警告信息 } void main(void) {  ...
  • zxccaoya
  • zxccaoya
  • 2016-12-05 18:58
  • 5695

函数返回类型为指针类型时的一些问题

1.先看程序:#includechar  *returnStr(){           char  *p = “tigerjibo”;   ...
  • tigerjb
  • tigerjb
  • 2012-04-04 14:43
  • 12722

函数返回值、引用和指针的区别思考

函数返回值、引用和指针的区别思考 收藏 学了引用、指针后,这些概念被教材拿去和函数搅在一起,于是使人感到很糊涂。涉及到函数返回的到底是值,引用还是指针的问题,其实就是函数返回的过程中和函数结束的过程中,哪些保留了,哪些复制了,哪些被处理掉的问题。我是这样理解的: 首先说函数内的对象的...
  • shangyaowei
  • shangyaowei
  • 2013-12-19 20:30
  • 1553

使用指针做函数返回值

1.使用指针做函数返回值 1、当使用指针做为函数的返回值时,主函数处的char *p;将获得调用函数char *pf;的值,即一个地址值,如oxAE72。此时需要我们注意的是该地址值所指向的空间是否存在(即已向操作系统声明注册,不会被释放,即可能被其他操作修改); 2、使用栈内存返回指针是明显错误的...
  • unix21
  • unix21
  • 2013-02-23 23:55
  • 1807

关于函数返回值为引用和指针的问题

如果函数的返回值为引用,则不需要创建无名临时对象,避免构造函数和析构函数的调用,从空间和时间上提高了程序执行的效率 返回值为引用的情况。 #include #include using namespace std; ...
  • yangshuangtao
  • yangshuangtao
  • 2015-09-13 13:29
  • 866

c/c++使用指针做函数返回值和指针作函数参数问题

一、使用指针做函数返回值:   1、当使用指针做为函数的返回值时,主函数处的char *p;将获得调用函数char *pf;的值,即一个地址值,如oxAE72。此时需要我们注意的是该地址值所指向的空间是否存在(即已向操作系统声明注册,不会被释放,即可能被其他操作...
  • zhangjikuan
  • zhangjikuan
  • 2016-07-07 09:32
  • 2365

函数指针和函数返回值为引用的区别

//#include //int ff(int(*p)(int, int), int a, int b)//形式1:返回类型(*函数名)(参数表).原始写法,阅读不便 //{ // return p(a, b); //} // //typedef int(*Pfun)(int, int);//形式...
  • chenzongduozhu
  • chenzongduozhu
  • 2016-11-19 15:14
  • 653

C/C++之函数返回值为指针或者是引用时常见错误总结

1、说明        函数如果是指针或则引用的返回,一般全局变量、局部静态变量、局部动态分配内存的变量可以使用作为函数的返回值,局部变量不行,因为局部变量函数调用完会自动销毁内存,这个时候返回的指针或则引用就有问题了。 2、展示代...
  • u011068702
  • u011068702
  • 2017-03-20 17:25
  • 833

函数指针,指针函数,返回值为指针的函数

在学习C语言时,一个比较容易混淆的概念就是函数指针、指针函数、返回值为指针的函数。本文将对这三个概念进行区分。指针函数就是返回值为指针的函数,两个本质上是同一事物,只是叫法不同。函数指针就是一个指向函数的指针,本质上是一个指针,只是这个指针指向的对象是函数,而不是一般意义上的存储对象。
  • wangxufa
  • wangxufa
  • 2017-06-08 21:23
  • 1089

指针函数与函数指针

1.指针函数 先看下面的函数声明,注意,此函数有返回值,返回值为int *,即返回值是指针类型的。 int *f(int a, int b);上面的函数声明又可以写成如下形式: int* f(int a, int b); 让指针标志 * 与int紧贴在一起,而与函数名f间隔开,这样看...
  • ameyume
  • ameyume
  • 2012-11-24 22:18
  • 93236
    个人资料
    • 访问:21864次
    • 积分:696
    • 等级:
    • 排名:千里之外
    • 原创:47篇
    • 转载:2篇
    • 译文:0篇
    • 评论:3条
    最新评论