2

我需要使用什么返回值和变量类型来捕获传递给函数的变量地址的返回值?

说:

RETURNTYPE get_address(int num){
return #
}

int main(){
int num = 1;
DATATYPE = get_address(num);
return 0;
}
4

5 回答 5

6

RETURNTYPE 和 DATATYPE 应该是int*,但请注意,返回指向函数参数的指针没有多大意义。

只要函数正在执行,函数参数就存在。一旦函数返回该变量不再存在并且使用返回的地址本质上是未定义的行为。

如果您想在调用站点将变量的地址用作参数,那么您根本不需要该函数get_address(),只需使用&运算符:

int main(){
  int num = 1;
  int* pnum = #
  return 0;
}
于 2012-10-15T07:36:50.100 回答
2

如果您可以访问 C++11,则可以使用内置的std::addressof

您可以实现一个返回参数地址的通用函数,如下所示:

template<typename T>
T* addr(T& param)
{
   return (T*)&(char&)param;
}

(这是C++11的实现,之所以这样是因为一元&可以重载)

请注意,您必须通过引用传递参数,否则您将返回局部变量的地址,这可能导致未定义的行为。

或者您可以简单地使用&. :)

我只需要验证 num 上的地址在按值传递时在函数内部和外部是不同的。

您可以通过值和引用传递相同的参数:

void compareAddresses(int passedByValue, int& passedByReference)
{
   std::cout << &passedByValue << " " << &passedByReference;
}
于 2012-10-15T07:41:13.060 回答
1

指针是保存地址的变量。所以你需要指向 int 的指针。

int* get_address (int num) {
    return &num;
}

int main () {
    int num = 1;
    int* pointer = get_address(num);
    return 0;
}

这当然不会起作用,因为您通过复制传递值,并且变量将从堆栈中释放并且指针将无效。

如果你需要一个函数,你应该通过引用传递它(这将返回变量的正确指针地址):

int* get_address (int &num) {
    return &num;
}

虽然你不需要函数。有点过分了。这工作得很好:

int* pointer = &num;
于 2012-10-15T07:36:38.277 回答
0

你不能,或者我应该说你不应该返回局部范围变量的地址,因为它们在函数返回后不再存在。因此,你得到的只是垃圾。

int num = 1;
int* addr = &num;

在 C++11 中,当您不知道类型时可以使用 auto,但不能从函数返回 auto。

auto num = 1;
auto addr = &num;
于 2012-10-15T07:40:09.603 回答
0

函数完成后,局部变量被销毁。函数调用可能会被其他函数调用覆盖。你不会得到你想要的。所以你不应该返回一个指向函数局部变量的指针。

于 2012-10-15T07:44:05.633 回答