C++指针: dereferencing,赋值等

标签 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)。我不想简单地通过记住这个指针行为来学习,我有兴趣了解它为什么这样工作。谢谢。

最佳答案

#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/

相关文章:

C++ AVL树实现

c++ - POD的默认析构函数是静态的吗?

java - 是否可以从用户模式 ​​java 应用程序查询特权 Windows 服务?

c# - 在 WPF 中单击按钮执行文件操作

c - 在 C 中,使用变量初始化数组会导致堆栈溢出错误或在 R 中调用代码时导致 R 崩溃

arrays - 为什么二维数组的行为类似于一维指针数组而不是一维整数数组?

c++ - 嵌套的 openmp 循环

C++ 类似于汇编的指针访问

c - C中数组变量与指针的地址和内容

c - 为什么我们在初始化一个指向整数的指针时,在整数变量前使用 "&"?