在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