C ++指针:解除引用,赋值等

时间:2014-06-21 12:43:12

标签: c++ pointers

我提出的问题非常基础,但我试图通过在编译器中进行练习来理解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)。我不想通过记住这个指针行为来学习,我有兴趣理解为什么它以这种方式工作。感谢。

2 个答案:

答案 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)并进行试验!