函数不更改传递的指针 C++

Function does not change passed pointer C++

提问人:c0ntrol 提问时间:8/7/2012 最后编辑:Adrian Molec0ntrol 更新时间:8/9/2021 访问量:63260

问:

我有我的函数,我正在那里填充,但是调用此函数后没有填充,但我知道它已填充在此函数中,因为我有输出代码。targetBubble

bool clickOnBubble(sf::Vector2i & mousePos, std::vector<Bubble *> bubbles, Bubble * targetBubble) {
    targetBubble = bubbles[i];
}

我像这样传递指针

Bubble * targetBubble = NULL;
clickOnBubble(mousePos, bubbles, targetBubble);

为什么它不起作用?

C++ 函数 指针

评论


答:

101赞 Andrew 8/7/2012 #1

因为你正在传递指针的副本。要更改指针,您需要如下内容:

void foo(int **ptr) //pointer to pointer
{
    *ptr = new int[10]; //just for example, use RAII in a real world
}

void bar(int *& ptr) //reference to pointer (a bit confusing look)
{
    ptr = new int[10];
}

评论

0赞 c0ntrol 8/7/2012
但是当我尝试你的应用程序时,它会在这条线上崩溃,我正在传递这样的论点*targetBubble = bubbles[i];clickOnBubble(mousePos, bubbles, &targetBubble);
0赞 Andrew 8/7/2012
@user1295618:你看到什么错误?可能我超出了范围
0赞 Andrew 8/7/2012
@user1295618:请提出一个新问题并在那里发布您的新代码。因为如果不看到实际代码,就很难说出问题出在哪里
0赞 Andrew 8/7/2012
@user1295618:它们是相同的,应该同时起作用。您的程序中可能存在未定义的行为,并且它的工作方式因启动而异
0赞 Sohaib 5/16/2017
@Andrew 第一种会通过指针取消引用导致分段错误?
8赞 mathematician1975 8/7/2012 #2

除非通过(非常量)引用或作为双指针传递指针,否则无法更改指针。按值传递会生成对象的副本,并且对对象所做的任何更改都是对副本进行的,而不是对对象进行的。您可以更改指针指向的对象,但如果按值传递,则不能更改指针本身。

阅读此问题以帮助更详细地理解 C++ 中何时通过引用传递以及何时通过指针传递差异?

32赞 Daniel Daranas 8/7/2012 #3

您正在按值传递指针。

如果要更新指针,请传递对指针的引用

bool clickOnBubble(sf::Vector2i& mousePos, std::vector<Bubble *> bubbles, Bubble *& t)

评论

12赞 paxdiablo 8/7/2012
+1.第一个答案在 C++ 的上下文中是正确的。建议双重定向指针的答案是旧的 C 方法。
27赞 AndersK 8/7/2012 #4

如果你写

int b = 0;
foo(b);

int foo(int a)
{
  a = 1;
}

您不会更改“B”,因为 A 是 B 的副本

如果要更改 B,则需要传递 B 的地址

int b = 0;
foo(&b);

int foo(int *a)
{
  *a = 1;
}

指针也是如此:

int* b = 0;
foo(b);

int foo(int* a)
{
  a = malloc(10);  // here you are just changing 
                   // what the copy of b is pointing to, 
                   // not what b is pointing to
}

因此,要更改 B 指向传递地址的位置:

int* b = 0;
foo(&b);

int foo(int** a)
{
  *a = 1;  // here you changing what b is pointing to
}

HTH系列