一文搞懂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

你可能感兴趣的:(C/C++学习,c++,指针)