C++ 更改C+中指针指向的地址+;

C++ 更改C+中指针指向的地址+;,c++,pointers,C++,Pointers,好的,我相信这个问题已经在这里被回答了一百万次,但是我已经在这个网站上搜索了一段时间了,我似乎找不到一个我满意的答案。如果你能给我指出一条关于这件事的重复解决的线索,我会很高兴的 所以我在C++中有这个指针,P,它指向一个整数。我把它指向这个整数x的内存地址,它的值是8。现在p存储x的内存地址,这是一个包含值8的整数。到目前为止还不错 然后我有一个函数f,它返回一个指向堆中整数的指针,该值在某种程度上取决于p。我可以做p=f(p)并按预期工作。现在p存储不同的内存地址。如果我打印出这个地址和地址

好的,我相信这个问题已经在这里被回答了一百万次,但是我已经在这个网站上搜索了一段时间了,我似乎找不到一个我满意的答案。如果你能给我指出一条关于这件事的重复解决的线索,我会很高兴的

所以我在C++中有这个指针,P,它指向一个整数。我把它指向这个整数

x
的内存地址,它的值是8。现在
p
存储
x
的内存地址,这是一个包含值8的整数。到目前为止还不错

然后我有一个函数
f
,它返回一个指向堆中整数的指针,该值在某种程度上取决于
p
。我可以做
p=f(p)并按预期工作。现在
p
存储不同的内存地址。如果我打印出这个地址和地址的内容,它会显示我希望它显示的内容

问题来了。我有另一个函数,
g
,它做的事情本质上与
f
做的事情相同(我怀疑这就是我弄错的地方,如果它们做的事情相同,它们的工作方式也会相同)
g
不返回任何内容,它接收指针p并尝试使其指向堆中的整数,与我之前对
f
所做的相同,只是我在函数内部执行赋值。 但是现在,当打印出
p
所指向的内存地址和存储在其中的值时,我看到
g
根本没有做任何事情

那么,
f
g
之间有什么区别呢?为什么我可以在函数外部执行赋值,但在函数内部执行却不行?它看起来像是在
g
中,我只是在使用
p
的一个副本,一个
g
的局部变量,而不影响全局
p
,但这些都是指针,全局和局部
p
的存储地址是相同的

代码如下:

#包括
使用名称空间std;
int*f(int*p);
无效g(int*p);
int main(){
int*p;
int x=8;
p=&x;

cout将
g
的参数
p
声明为pass by value,它是从参数复制的,指针本身的任何修改(如
p=…
与原始参数无关。原因与

void g(int p) { // p is passed by-value
    p = 65;     // modification has nothing to do with the argument passed
}
存储的内存地址相同

是的,它们都指向同一个对象。您可以修改通过指针指向的对象,如
*p=…

您可以将
g
更改为通过引用传递

void g(int *&p) {
    cout << p << endl;
    int* n = new int(65);
    p = n;
}
void g(int*&p){

cout将
g
的参数
p
声明为pass by value,它是从参数复制的,指针本身的任何修改(如
p=…
与原始参数无关。原因与

void g(int p) { // p is passed by-value
    p = 65;     // modification has nothing to do with the argument passed
}
存储的内存地址相同

是的,它们都指向同一个对象。您可以修改通过指针指向的对象,如
*p=…

您可以将
g
更改为通过引用传递

void g(int *&p) {
    cout << p << endl;
    int* n = new int(65);
    p = n;
}
void g(int*&p){

请记住您在第2段中提出的观点。现在对其进行一点扩展。指针是一个包含地址的变量。如果您将此指针传递到函数中,由于
p
,无论
p
指向什么,都会通过引用传递,但是
p
本身是通过值传递的。
g
中的
p
是一个局部变量-作用域变量,是
main
p
的副本。两个副本最初存储相同的地址

然后
p=n;
更改副本,并且
main
p
不受影响

g
必须通过引用接受
p
,才能更新调用方的参数

void g(int *p)
必须改为

void g(int * & p)

请记住您在第2段中提出的观点。现在将其扩展一点。指针是一个包含地址的变量。如果您将此指针传递给函数,则
p
所指向的任何内容都将通过引用传递,这要归功于
p
,但
p
本身是通过值传递的。
p
内部
g
是一个局部范围d变量,它是
main
p
的副本。两个副本最初存储相同的地址

然后
p=n;
更改副本,并且
main
p
不受影响

g
必须通过引用接受
p
,才能更新调用方的参数

void g(int *p)
必须改为

void g(int * & p)

哦,我明白了。我认为g里面的“p”和它外面的“p”是一样的,因为它们存储了相同的地址。我应该打印&p,看看它们实际上是如何不同的变量。谢谢much@APL2020就是这样!哦,我明白了。我以为“p”里面的g和外面的一样,因为它们存储的是同一个地址。我应该打印&p,看看它们实际上是如何不同的变量。谢谢much@APL2020正是这样!