一文搞懂C++指针指向谁/指针初始化问题

  在C/C++中,指针是一种复合类型,通过指向某一对象实现对其的间接访问。实际编程中,很多同学不太清楚指针都指向了谁,这在程序中是危险的。
  要明白指针指向对象的问题,首先要明白两个操作符的概念:

  • 取地址符(&):获取某个对象的地址。这里要注意与引用区分开,如果不清楚引用,可以看我的其他文章。

  • 解引用符(*):如果指针指向了某一个对象,用解引用符来访问该对象。

  下面来看两个基本的指针初始化例子:
第一种:

    int i = -42;
    int *p = &i;//初始化一个指向int型i的指针p
    std::cout << i << std::endl;//输出i = -42
    std::cout << *p <<std::endl;//输出指针p指向的对象i的内容,为 -42

第二种:

    int i = -42;
    int *p ;//声明一个int型指针变量p,并未指向任何对象
    p = &i;//指针p指向对象i
    std::cout << i << std::endl;//输出i = -42
    std::cout << *p <<std::endl;//输出指针p指向的对象i的内容,为 -42

  很多同学到这里会迷糊,一会加&一会不加,一会加*一会不加,自己实际写可能会出现这种代码:

    int i = -42;
    int *p;
    *p = i;
    std::cout << i <<std::endl;//输出i = -42
    std::cout << *p <<std::endl;//输出指针p指向的内容,为 -42,到这里还看似没问题
    *p = 666;//修改指针p指向内容的值,改为666
    std::cout << i <<std::endl;//输出i的值,结果为-42。明明通过指针p间接修改i的值为666了啊?
    std::cout << *p <<std::endl;//输出666

  从上面的错误代码可以看出,指针p其实并没有指向对象i,只不过是将其指针存储的内容赋值为了i的值-42而已,所以修改指针p的内容并不能修改i的值,这也就失去了指针的使用意义。
  如果你的思绪还是有些乱,不如尝试这样记忆:赋值永远改变的是等号左侧的对象

    int i = -42;
    int *p;
    p = &i;//指针p指向对象i
    *p = 666;//将指针p指向的对象i的值改为666
    std::cout << i <<std::endl;//输出666
    std::cout << *p <<std::endl;//输出666
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值