【问题标题】:Pointers - Is a function that receives an address can get int?指针 - 接收地址的函数是否可以获取 int?
【发布时间】:2017-03-25 10:50:48
【问题描述】:

在这个例子中:

#include <iostream>
using namespace std;

void foo(int& x)
{
   x = x%2 + 10;
}

int* goo(int& y)
{
    y = y/100 + y%10;

    return &y;
}

void main()
{
    int temp = 1234;
    int *p = goo(temp);
    cout << temp << endl;
    foo(*p);
    cout << temp << endl;
}

有获取int地址的goo函数, 但是你可以看到 main 有一个你发送给这个函数的 int temp。 该函数应该获得一个地址,但它却获得了 int 怎么可能?

我运行了该程序,它确实有效,但我不明白为什么。

【问题讨论】:

  • stackoverflow.com 上的所有问题都必须以纯文本形式包含问题本身中的所有相关信息。不接受任何可能随时停止工作、使问题变得毫无意义的外部网站链接。
  • 你可以在这里发布你的代码而不是图表吗?
  • goo 没有得到 int 地址。
  • 不,该程序绝对不能“工作”。 goo() 被声明为返回一个指向 int 的指针,但它没有返回任何东西;并且返回值被取消引用。这是未定义的行为。
  • @Sam Varshavchik 我编辑了问题,不知何故,返回语句从我添加的代码中抛出,而不是提供的屏幕截图 OP,合并错误?

标签: c++ pass-by-reference


【解决方案1】:

这不是“int 地址”。松散地定义, int 的地址将是指针,这就是 goo 返回的内容。它通过 一个引用 来存储 int 类型,或者用 C 术语来说,一个 int 参数是通过引用传递的(在 C 中这意味着传递了一个指针)。引用接近于指针,但不受指针数学的影响,并且具有与变量相同的语法。

函数 goo() 返回指向通过引用传递的参数的指针,在这种情况下本质上它返回指向 temp 的指针。这些是与类型标识符组合使用的常用声明符:

  • type& var - 对类型的引用
  • type* var - 指向类型的指针
  • type&& var - 对类型的右值引用

引用类型的变量不能被初始化,只能通过左值来初始化。引用被评估为左值,评估为与用于初始化的左值相同的存储。

int b = 222;
int *p = new int(111);

int& refb = b;  // evaluated to the storage of b;
int& refp = *p; // evaluated to the storage in dynamic memory, pointed by p;
int& illegal = 2; // ERROR: not a lvalue;

除了重载运算符的形式参数列表、移动语义和模板构建之外,很少使用右值引用声明。

【讨论】:

  • goo 没有返回任何内容
  • @OMGtechy goo 返回 &y
猜你喜欢
  • 2019-11-11
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多