修改指针在C++函数中指向的位置

Ant*_*ito 5 c++ pointers

我一直坚持修改指针指针.问题是我不明白为什么我的代码有效.我要做的是修改指针指向函数的位置.然后在我的main函数中访问该值.我尝试了很多尝试,这是我开始工作的唯一方法.

#include <iostream>
using namespace std;
void changePP(int **ppint) {
    int *n = new int;
    *n = 9; //just a value for demonstration purposes
    *ppint = n; //THE LINE IN QUESTION
    delete n;
}
int main() {
    int **ppint = NULL;
    int *p = new int;
    *p = 4; //another value for demonstrating
    ppint = &p;
    cout << **ppint << endl;
    changePP(ppint);
    cout << **ppint << endl;
}
Run Code Online (Sandbox Code Playgroud)

因此,输出为4,然后在单独的行上为9.但是,我不确定*ppint = n代码中的行.为什么我必须使用*更改ppint指向changePP函数的位置而不是主要?另外为什么我不必&在功能中使用?我似乎无法找到一个我能在互联网上理解的解释,我想知道是否有人可以为我解释这个?

Jam*_*son 7

注意:这些内存地址仅用于说明.

内存布局

0x0A | 4
0x0B | 'p' -> 0x0A // Pointer to the value 4 in location 0x0A
0x0C | 'ppint' -> NULL // Initially a null pointer
Run Code Online (Sandbox Code Playgroud)

执行ppint = &p;产生以下内容,因为这里ppint的指针位于0x0C.

0x0A | 4
0x0B | 'p' -> 0x0A
0x0C | 'ppint' -> 0x0B
Run Code Online (Sandbox Code Playgroud)

至于changePP函数中的参数,我将参考它ppintCopy以减少混淆.它是一个副本(即不同于的指针ppint),修改它只会修改副本.

0x0D | 'ppintCopy' -> 0x0C // A pointer that points to `ppint`
Run Code Online (Sandbox Code Playgroud)

执行ppintCopy = &n会修改指针,0x0D而指针不是main函数指针的位置.但是,因此,引用ppintCopy(即*ppintCopy)产生0X0C哪个是来自main函数*ppintCopy = n;的指针正在改变指针所指向的0x0C位置.

为什么我必须使用*来改变ppint指向changePP函数的位置而不是主要的?

通过上面的插图,我希望更清楚为什么它可以工作main,为什么你必须在changePP函数中使用不同的语法.

另外为什么我不必在函数中使用&?

main函数中,变量ppint是类型int**(即指向指针的指针)并且p是类型int*.您无法执行,ppint = p;因为它们是不同的类型.如果删除一个间接级别,这可能更容易看到.例如:

int* pMyInt = NULL;
int myInt = 3;
Run Code Online (Sandbox Code Playgroud)

我认为这是非常自我解释,这是不可行的(即,它们是不同的类型).

pMyInt = myInt;
Run Code Online (Sandbox Code Playgroud)

但是,您可以myInt使用&运算符的地址来生成指向int的指针(即,int*),因为此类型pMyInt与赋值的类型相同,现在是可能的.

pMyInt = &myInt;
Run Code Online (Sandbox Code Playgroud)


mr5*_*mr5 5

ppint; // the variable name
*ppint; // dereference the first layer of pointer
*(*ppint);  // dereference the first layer of pointer which points to another pointer that contains a **value**
Run Code Online (Sandbox Code Playgroud)

因此,*ppint = n;意味着指向ppint另一个存储位置,该位置是分配给n它的位置,或者它可以被重写为*ppint = &n;

在该行之后,您已删除了n该值但未更改其值,因此除非已访问并修改了某些值,否则该值保持不变.

n删除它后仍然保留值的原因被认为是未定义的行为.

  • 很好地发现了未定义的行为,我错过了。 (2认同)