这段代码在C ++中是如何工作的

时间:2012-11-19 15:58:57

标签: c++ pointers

例如这段代码:

#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,并在函数结束后立即删除,对吗?在堆栈内存消耗方面,哪些调用更便宜?或者两者都是一回事?

3 个答案:

答案 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