我一直坚持修改指针指针.问题是我不明白为什么我的代码有效.我要做的是修改指针指向函数的位置.然后在我的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函数的位置而不是主要?另外为什么我不必&在功能中使用?我似乎无法找到一个我能在互联网上理解的解释,我想知道是否有人可以为我解释这个?
注意:这些内存地址仅用于说明.
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)
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删除它后仍然保留值的原因被认为是未定义的行为.