我提出的问题非常基础,但我试图通过在编译器中进行练习来理解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)。我不想通过记住这个指针行为来学习,我有兴趣理解为什么它以这种方式工作。感谢。
答案 0 :(得分: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;
这意味着,&#34;将值3存储在p指向&#34;的位置。但是p
并没有指向任何东西,因为你没有指定它指向任何东西,直到两行之后。
p = &i;
这意味着,&#34;将i的地址指定为p&#34;的值。换句话说,&#34;将地址存储在p&#34;中。 p
需要指向某事,然后才能分配给指向的事物。否则你有不确定的行为。
在最后一节:
int main(){
i=5;
p=&i;
*p=3;
*p=6;
cout<<*p<<endl;
return 0;
}
你这样说:&#34;这不会改变存储在* p的值(它仍然是3)。&#34; - 我不确定你为什么这么说。是的,它会更改存储在*p
的值(i
的值)。它将其更改为6。
答案 1 :(得分:1)
问题是,为什么这不起作用:
int *p, i;
int main(){
*p=3;
这里你尝试取消引用p
并写一些东西,但由于p
在这里未初始化(例如它可以是0),你试图写入你没有写过的内存。 t allocate,因此这是一个分段错误。
另外,如果在我写的第二个例子中我添加了另一个赋值:[...]这不会改变存储在* p的值(它仍然是3)。
实际上,它会。为什么你会这么想?
我有兴趣了解它为什么会这样运作。
您已走上正轨,继续阅读(例如this thread)并进行试验!