如果在单独的方法中使用,指针指针的指针不起作用

时间:2015-04-11 16:48:44

标签: c++ pointers

在main中,如果使用注释掉的行而不是上面的那行,我将丢失指针并且没有任何内容被打印到控制台。我必须遗漏一些关于指针的基本属性,但我认为当我将指向x和y的指针传递给foo()时,它们的赋值将与在main中本地完成相同逻辑的情况相同。我错过了什么以及什么会使赋值在foo()中正常工作?

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string>

using std::cout;
using std::endl;
using std::string;

const int maxSize = 3;

struct Item{
    string key;
    string value;
};

struct Node{
    int count;

    Item *item[maxSize + 1];
    Node *branch[maxSize + 1];
};

void foo(Item *x, Item*y)
{
    y = x;
}

int main(int argc, char *argv[])
{
    Item *x = new Item();
    x->key = "hi";
    x->value = "there";

    Item *y = new Item();

    y = x;
    //foo(x, y);

    Node *p = new Node();
    p->item[1] = y;

    cout << p->item[1]->key << " " << p->item[1]->value << endl;

    return 0;
}

3 个答案:

答案 0 :(得分:1)

你的主要问题基本上是这样的:“如何将一些代码移动到函数中并获得相同的行为?”

main内,你有y=x。但在描述如何将该逻辑转换为函数之前,我应该说这一行非常奇怪,可能不会按照您的意愿执行。

但是,我会忽略它,我会假装main中的y=x是'正确',然后你想将该代码移动到一个函数中。在不改变行为的情况下,C ++将代码移入函数的正确方法是使用引用。

例如,如果你有

int main() {
    int a = 3;
    int b= 0;
    b = a;
}

您可以针对相同的行为执行此操作:

void foo(int &a, int &b) {
    b = a;
}
int main() {
    int a = 3;
    int b= 0;
    foo(a,b);
}

应该注意的是,变量的名称是没有意义的。我们可以按如下方式编写foo,它们将完全相同。

void foo(int &left, int &right) {
    right = left;
}

无论如何,将代码复制并粘贴到函数中,并将所有参数都引用到引用中。在您的情况下,只需

void foo(Item *(&x), Item*(&y))
{
    y = x; // does exactly the same as y=x in main, because x and y are references here
}

有时,关于*&的展示位置,该语言会让人感到困惑,因此将参数x转换为引用的最简单方法是放置( )围绕它并将&放在( )内。即x变为(&x)

答案 1 :(得分:0)

在函数foo内,xy是局部变量(恰好是指针)。如果您更改它们的值(它们指向的地址),就像所有局部变量一样,根据定义,更改也是本地的。

如果你想使用这些指针提供的信息(某些东西的地址)来改变内存中的值,你可以这样做(在被调用的函数foo中):

*y = *x;

请注意,这不会对指针执行任何更改(因为它们是局部变量),但它会更改它们指向的值。

如果你想改变调用函数的指针(而不是它们指向的值),你仍然可以通过将指针传递给你想要改变的指针来应用与上面相同的逻辑

void foo(Item **x, Item **y)
{
    *y = *x;
}

请记住,相同的赋值在调用者和被调用者之间具有不同的语义。有关如何在保持正确语义的同时将类似代码提取到另一个函数中的详细说明,请参阅Aaron McDaid's answer

答案 2 :(得分:0)

y=x所做的是y指向同一个x指向的对象,留下任何y实际指向的对象。

关键点是foo的x和y与main的x和y不同:它们是指向调用foo时所说内容的其他指针。

y=x进入foo除了它之外没有任何影响(它只是改变&#34;方向&#34;本地y是&#34;指向&#34;到)

Item *y = new Item();
y = x;
那么,在主要的

是无意义的:你在内存中创建一个新的Item,使y指向它,然后将y方向改为x方向,(使y和x指向同一个对象)使新分配的项目无法访问。

如果您希望y引用的项目看起来与x引用的项目相同,则应该*y = *x而不是y=x

将指针想象为&#34;手指指向某物&#34;。 如果你想让两个不同的对象变得相等,你必须将一个对象分配给另一个,而不是&#34; reorient&#34;手指指向同一个(在你的情况下是空的)