我问的问题非常基础,但我试图通过在编译器中做练习来理解 C++ 中指针的行为。因此,例如,我首先声明一个 int 指针 *p 并尝试为其赋予一些值并打印它:
#include <iostream>
using namespace std;
int *p, i;
int main(){
i=5;
p=&i;
cout<<*p<<endl;
return 0;
}
这很清楚也很容易,对吧?但是当我想知道为什么 C++ 语法以这种方式工作时,我测试了另一种为指针赋值的方法:
#include <iostream>
using namespace std;
int *p, i;
int main(){
i=5;
p=&i;
*p=3;
cout<<*p<<endl;
return 0;
}
很明显,现在的结果不一样了。问题是,为什么这行不通:
#include <iostream>
using namespace std;
int *p, i;
int main(){
*p=3;
i=5;
p=&i;
cout<<*p<<endl;
return 0;
}
为什么我必须先取消对指针的引用,然后再为其赋值,但如果不取消引用,直接赋值就无法工作?
另外,如果在我写的第二个例子中我添加了另一个赋值:
int main(){
i=5;
p=&i;
*p=3;
*p=6;
cout<<*p<<endl;
return 0;
}
这不会改变存储在 *p 的值(它仍然是 3)。我不想简单地通过记住这个指针行为来学习,我有兴趣了解它为什么这样工作。谢谢。
最佳答案
#include <iostream>
using namespace std;
int *p, i;
int main(){
*p=3;
i=5;
p=&i;
cout<<*p<<endl;
return 0;
}
这不起作用,因为您正试图为 p
指向的整数赋值。这就是这一行的作用:
*p = 3;
这意味着,“将值 3 存储在 p 指向的位置”。但是 p
没有指向任何东西,因为直到两行之后你才指定它指向任何东西。
p = &i;
这意味着,“将 i 的地址分配给 p 的值”。或者,换句话说,“将 i 的地址存储在 p 中”。 p
需要指向某些东西,然后才能分配给 p 指向的东西。否则你有未定义的行为。
最后一节:
int main(){
i=5;
p=&i;
*p=3;
*p=6;
cout<<*p<<endl;
return 0;
}
你这样说:“这不会改变存储在 *p 中的值(它仍然是 3)。” ——我不知道你为什么这么说。是的,它会更改存储在 *p
中的值(即 i
的值)。它将它更改为 6。
关于C++指针: dereferencing,赋值等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24341724/