大学初学指针的时候,时常懵逼,有时候觉得自己已经掌握了,但是一看复杂的程序和源码里的指针用法,就又蒙了,以至于谈指针色变。至于二级指针,数组指针、指针数组、函数指针什么的更是被吓懵。现在来逐个击破他们,为我们的编程道路扫清阻碍。
首先需要明白一点的是,指针是个变量,它和int类型、float类型等的变量一样,也存储在内存中,占据一定的字节。只是int变量存储的是整形数字,而指针变量存储的是地址,掌握了这点,攻破指针就指日可待了。
假设存在一个int类型的变量a,一个指向int类型的指针p。
现在来*p=a和p=&a的区别。先分析*p=a,这是一个赋值操作。这里可以把*p当成另外一个int b变量。b=a,是不是就很熟悉了。所以*p=a表示把a的值赋值给p所指向(存储)的内存地址。
再分析p=&a。这里就很好理解了,把a的地址,赋值给p。即p指向(存储)了a的地址。
结合实际例子分析:
运行环境:VS2013,语言:C++。
#include <iostream>
using namespace std;
int main()
{
int a = 2;
int *p = &a;
printf("%d\n", *p);
int *PA = new int;
cout << "PA 地址=" << PA << endl;
*PA = a;
cout << "*PA=" << *PA << endl;
cout << "PA 地址=" << PA << endl; //地址不变
cout << "------------我是分割线------------" << endl;
int *PB = NULL;
/*如果使用PB = &a后,对PB进行delete会报错,
因为PB已经指向a的地址,对a进行delete操作,是不行的。
但是不delete又会内存泄漏,所以用空指针指向a。
*/
//int *PB = new int;
cout << "PB 地址=" << PB << endl;
PB = &a;
cout << "*PB=" << *PB << endl;
cout << "PB 地址=" << PB << endl; //地址变了
delete PA; //记得用delete释放指针PA占用的内存
PA = NULL; //然后使指针指向空
//delete PB;
//PB = NULL;
getchar();
return 0;
}
输出:
二者区别:
*PA=a; 表示把a的值赋值给PA所指的内存地址,PA本身没变。
PB=&a; 表示指针PB指向变量a的地址,PB本身变了。