C ++如何从函数返回和收集地址

时间:2012-10-15 07:33:45

标签: c++ parameters return

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

说:

RETURNTYPE get_address(int num){
return #
}

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

5 个答案:

答案 0 :(得分:6)

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

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

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

int main(){
  int num = 1;
  int* pnum = #
  return 0;
}

答案 1 :(得分: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;
}

答案 2 :(得分: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;

答案 3 :(得分:0)

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

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

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

auto num = 1;
auto addr = &num;

答案 4 :(得分:0)

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