例如这段代码:
#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,并在函数结束后立即删除,对吗?在堆栈内存消耗方面,哪些调用更便宜?或者两者都是一回事?
答案 0 :(得分:1)
它们几乎相同。唯一的区别是你在p
的调用堆栈上有一个指针对象main
,但是如果你担心这个问题那么你就会遇到问题。 :)
答案 1 :(得分:0)
在第一次调用中,您传递的变量包含value
的地址。
在第二个中,您将直接传递value
的地址。
请注意,赋值运算符表示p
和&value
都相同,因此您应该能够将任何一个传递给函数,因为您已经证明了这一点。
答案 2 :(得分: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