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

C++ how to return and collect an address from a function

本文关键字:地址 返回 函数 C++      更新时间:2023-10-16

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

说:

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

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

函数

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

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

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

如果您有权访问 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;
}

指针是保存地址的变量。所以你需要指向 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;

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

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

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

auto num = 1;
auto addr = &num;

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