2

例如这段代码:

#include <iostream>
using namespace std;

void foo(int* x){ cout << "X = " << *x << endl;}

int main()
{
    int value = 5;
    int *p = &value;
    foo(p);
    foo(&value);
    return 0;
}

在函数的第一次调用中,foo实际上在函数内创建了指针 p (x) 的副本,并在函数结束后立即删除,对吗?在第二次调用foo变量值的地址时,使用该地址创建一个指针 x,并在函数结束时立即删除,对吗?就堆栈内存消耗而言,这些调用中哪个更便宜?还是两者都是一样的?

4

4 回答 4

1

它们几乎相同。唯一的区别是您p在 in 的调用堆栈上有一个指针对象main,但是如果您要担心这一点,那么您就会遇到问题。:)

于 2012-11-19T16:01:43.317 回答
1

他们都很相似。第一个看起来更昂贵,因为您创建了两次指针,一次作为局部变量(内部main),再次作为函数参数(传递给foo),但是编译器的“优化”阶段可能会将第一个变成第二个(假设您唯一要做的p就是传递它,并且您稍后不会重用它main)。

于 2012-11-19T16:04:10.403 回答
0

在第一次调用中,您传递了一个包含地址的变量value

在第二个中,您直接传递地址value

请注意,赋值运算符表示两者p&value是相同的,因此您应该能够将任何一个传递给您已经证明的函数。

于 2012-11-19T16:02:56.720 回答
0

指针具有可以像其他所有内容一样复制的值。它们具有价值语义。

void foo(int* t);

按值获取指针。它将创建指针参数的副本并在其主体中使用它。

int value = 23;
int *p = &value; // &value takes the address of value and use it to copy initialize p
foo(p); // copy the value of the pointer inside foo
foo(&value); // do the same but don't create a temporary
于 2012-11-19T16:03:03.983 回答