指针是C和C++的重点,也是后面学习数据结构的基础,因此深刻理解指针的概念很重要。但是指针的概念比较抽象,难于理解,而且一些复杂的程序中都是离不开指针的,如果不能理解指针,那么就不能理解较为复杂的程序了,作者结合了自己学习C++的经验,对指针,指针变量,地址作如下阐述。
1.什么是指针:
程序中最离不开的就是变量,而变量相当于是一个容器,是用来存放数据的,变量是存放在内存中的。在C++ 中定义变量的形式是: 数据类型 + 变量名,这里的变量名实际上是一个符号地址,在程序编译时,操作系统将为每个变量在内存中分配内存,所以每个变量都有一个在内存中的地址,即物理地址,并将变量的符号地址(变量名)和物理地址关联起来,所以,我们在程序中对变量名的操作,编译时编译器都会将变量名转换为变量在内存中的物理地址,从而实现了对内存中指定地址区域的数据的操作,这就是变量的实现原理。变量在内存中的地址又称作指针,我们说“变量的地址” 就等价于 “变量的指针”,但是指针和指针变量是不一样的。
2.指针变量的概念:
从上面我们可以看到,每个变量都有一个符号地址(变量名)和物理地址(在内存中的位置,又叫做指针)。变量是可以存储数据的,但是指针变量与普通变量不同,它用来存放普通变量的地址,即指针变量是用来存放普通变量的指针。要知道,指针变量也是一个变量,在内存中也是占内存的,只不过它不存放基本类型数据,而是存放其他基本类型变量的地址。既然指针变量也有自己的物理地址,那么指针变量的地址用什么 来存储呢?用比该指针类型高一级的指针变量来存放指针变量的地址,如二级指针变量存放一级指针变量的地址,三级指针变量存放二级变量的地址,依次类推。
3.总结:
牢记三句话:
指针就是地址,地址就是指针;指针变量是一个变量,它保存了基本类型变量的地址。
如果指针变量p保存了变量a的地址,那么称作p指向了a,*p 就是变量a。
如果p是一个指针变量,*p 表示了以 p 的内容为地址的变量,就是p指向的变量。
4.举例如下:
int a ; //定义int类型变量
int *p = &a; //变量 p 是一个 int* 类型的一级指针变量,&是取地址符,p保存了a 的地址
cout << *p <<endl; //输出 p 指向变量的值,即输出a的值
cout << p << endl; //输出 p 的值,即输出变量a在内存中的地址
int **q; //定义二级指针变量
q = &p; // 二级指针变量q保存了一级指针变量p的地址
cout << q <<endl; //输出指针变量p在内存中的地址
cout << *q << endl; //输出q指向变量的值,即变量p的值,即a的地址
cout << **q << endl; //可以这样理解 cout<<*(*q), 等价于 cout <<*p, 即输出a的值