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