Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数不更改传递的指针C++;_C++_Function_Pointers - Fatal编程技术网

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

C++ 函数不更改传递的指针C++;,c++,function,pointers,C++,Function,Pointers,我有我的函数,我正在那里填充targetBubble,但是调用这个函数后它没有被填充,但是我知道它被填充在这个函数中,因为我有输出代码 bool clickOnBubble(sf::Vector2i & mousePos, std::vector<Bubble *> bubbles, Bubble * targetBubble) { targetBubble = bubbles[i]; } 为什么它不起作用?谢谢,因为您正在传递指针的副本。要更改指针,需要以下内容:

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

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

为什么它不起作用?谢谢,因为您正在传递指针的副本。要更改指针,需要以下内容:

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


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

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


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


阅读此问题有助于更详细地理解差异

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


阅读此问题有助于更详细地理解差异

您正在按值传递指针

如果要更新指针,请将引用传递给指针

bool clickOnBubble(sf::Vector2i& mousePos, std::vector<Bubble *> bubbles, Bubble *& t)
bool点击气泡(sf::Vector2i和鼠标点、std::vector气泡、气泡*&t)

您正在按值传递指针

如果要更新指针,请将引用传递给指针

bool clickOnBubble(sf::Vector2i& mousePos, std::vector<Bubble *> bubbles, Bubble *& t)
bool点击气泡(sf::Vector2i和鼠标点、std::vector气泡、气泡*&t)
如果您编写

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
}
如果你写

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

+1。在C++上下文中正确的第一个答案。建议使用双间接指针的答案是C的老方法。在C++上下文中正确的第一个答案。建议使用双间接指针的答案是C语言的老方法,但是当我尝试你的方法时,它在这行崩溃了我传递的参数如下<代码>点击泡泡(鼠标、泡泡和目标泡泡)@user1295618:您看到了什么错误?可能我没钱了range@user1295618:请提出一个新问题,并在那里发布新代码。因为如果没有看到你的实际情况,很难说问题出在哪里code@user1295618:它们是一样的,应该两者都能工作。可能您的程序中有未定义的行为,并且从启动到启动,其工作方式不同launch@Andrew第一种方法可能会通过指针解引用导致分段错误?但当我尝试您的方法时,它会在这一行崩溃
*targetBubble=bubbles[I]我传递的参数如下<代码>点击泡泡(鼠标、泡泡和目标泡泡)@user1295618:您看到了什么错误?可能我没钱了range@user1295618:请提出一个新问题,并在那里发布新代码。因为如果没有看到你的实际情况,很难说问题出在哪里code@user1295618:它们是一样的,应该两者都能工作。可能您的程序中有未定义的行为,并且从启动到启动,其工作方式不同launch@Andrew第一种可能通过指针解引用导致分段错误?