用生活中的事物去描述一下对C/C++指针的理解。希望能为将要学习或也在学习的同学提供一丝灵感。同时欢迎每位读者朋友提出宝贵的意见和建议。
祝每一位读者快乐!
一、何为指针。
所谓指针,是存放数据的内存单元地址。指针就是地址,指针(地址)是一种数据类型。指针也是变量,但只能存放地址类型的数据,可以称为“地址型”变量。那么什么是内存单元地址呢?
1.内存单元地址
运行一个程序时,程序本身和程序中用到的数据都要保存在计算机的内部存储器中。而内部存储器是由很多个内存单元(字节)组成,每个单元都有自己独有的、相互不同 的地址。
2.变量
程序中可以用变量来存放各种数据,因此每个变量都需要分配连续的字节。当一个变量只占用一个字节时,该字节的地址就是变量的地址。当变量占用连续的若干个字节时,第一个字节的地址(该字节的地址值是所占用的连续字节中地址值最小的)就是该变量的地址。
如图6-1中字符型‘A’的地址就是2000,短整型 5 的地址是2010,单精度实型 70.0 的地址是3000。
3.数组
除了变量以外,程序中还可以用数组来存放数据。一个数组的首地址,就是第1个元素(即下标为0的数组元素)的地址。
如果知道数组a的首地址和数据类型,就可以通过下列公式计算出每个数组元素的地址,从而找到每个数组元素:
数组元素a[i]的地址 = 数组首地址 + i * 数组元素的数据类型所占用的字节数
4.指针变量
除了上述所介绍的直接存取方式外,还可以采用另一种存取方式,就是先把要存取的变量的地址存入一个”特殊变量“,然后通过这个其值为地址的”特殊变量“来存取变量的值。这种存放地址值的”特殊变量“就是指针变量。
二、指针变量的定义和初始化
1.指针符号
(1)取地址符号的对象必须是已定义过的变量或数组元素,但不可以是数组名。
(2)指针符号的对象必须是地址,可以是已赋值的指针变量,也可以是变量或数组元素的地址,但不能是整数,也不能是非地址型的变量。
★注意:当指针变量的值为一位数组的首地址时,例如:执行了”
2.定义
指针变量在使用前必须先定义,定义的同时可以赋初始值。
格式: 数据类型 * 指针变量明 [ = 初值]
其中的“初值”通常是“& 变量名“、” & 数组元素“或”一维数组名“,这里的变量或数组必须在前面已定义。
例如:
int a;
int * p =& a;
先定义整型变量a,然后定义一个指向整型数据的指针变量p,并赋初值为变量a的地址,即整型的指针变量p指向整型变量a。
float f1,f[10], * p1 =& f1,* p2 = f;
通过赋初值使指针变量p1、p2分别指向变量f1和一维数组f。
三、个人理解《盐与盐盒的故事》
1.故事主角
盐:变量存放的各种数据,也可以成为内存单元。
袋装盐:地址,告诉我们这就是盐。
盐盒:我们的指针变量大人。
2.内容
福岛核电事故后,大家疯狂的买袋装盐囤积在自家各种袋装的橱柜里。但是做饭时使用袋装盐很不方便,所以就有了厨房必备小盐盒。每次使用时,直接用小盐盒,方便又快捷。那么如何往盐盒里面加盐呢?
首先,我们通过袋子去拿盐。程序中 “ & ” 就代表袋子。 如: & a;
其次,是把盐倒入盐盒,但盒子上有盖子,也可以理解为盒子就是标识符,所以我们要打开盖子。程序中 “ * ” 就是代表打开盖子。如:int * p;
最后,将盐存放进去。如:int * p = & a;则 * p 就代表变量a;
3.扩展
那么一维数组就想有一排调料盒,数据类型就是调料。其实也可以比喻成超市的货架。大家可以去感受一下哈,发散一下思维。
当遇到不明白的地方,用生活中的例子去看指针,会比较直观一些。
四、结尾
1.给大家分享一个牛人解释的博客,直接用程序数据去分析理解指针和指向指针的指针
http://www.cnblogs.com/dzry/archive/2011/05/12/2044835.html