提问人:c0ntrol 提问时间:8/7/2012 最后编辑:Adrian Molec0ntrol 更新时间:8/9/2021 访问量:63260
函数不更改传递的指针 C++
Function does not change passed pointer C++
问:
我有我的函数,我正在那里填充,但是调用此函数后没有填充,但我知道它已填充在此函数中,因为我有输出代码。targetBubble
bool clickOnBubble(sf::Vector2i & mousePos, std::vector<Bubble *> bubbles, Bubble * targetBubble) {
targetBubble = bubbles[i];
}
我像这样传递指针
Bubble * targetBubble = NULL;
clickOnBubble(mousePos, bubbles, targetBubble);
为什么它不起作用?
答:
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系列
评论