指针是C语言中的一个难点,但是只要自己有一套对指针的学习方法或是对指针的理解,那么一切变得简单了,今天先总结指针中简单的“变量、一级指针、二级指针之间的关系”。 一、关于指针的定义及其注意
在计算机硬件系统的内部存储器中,拥有大量的存储单元(容量为1字节)。为了方便管理,必须为每一个存储单元编号,这个编号就是存储单元的“地址”。每个存储单元都有一个唯一的地址。 1> 在定义指针时,“*”号表示定义的变量时指针变量,变量的值只能存放地址。 2> 一个类型的指针只能指向同类型的变量,不能指向其他类型的变量。 6.使用“*”获取指针对应存储区域的内容 指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。指针变量的赋值只能赋予地址,绝不能赋予任何其它数据,否则将引起错误。 7.&、*的说明 &:取地址运算符 *:指针运算符(或称“间接访问”运算符) 使用时的一般格式: &变量名 如: 1) 在定义变量的时候*是一个类型说明符,说明定义的这个变量时一个指针变量 如: *p=123; 小结:“*”的用法: 用于定义指针变量 存储指针变量指向的存储空间的内容 8.二级指针介绍 如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。也称为“二级指针” 通过指针访问变量称为间接访问。由于指针变量直接指向变量,所以称为“一级指针”。 而如果通过指向指针的指针变量来访问变量则构成“二级指针”。 9.指针为什么要区分类型 在同一种编译器环境下,一个指针变量所用的内存空间是固定的。比如,在16为编译器环境下,任何一个指针变量都只占用2个字节,并不会随所指向变量的类型而改变。 虽然所有的指针都只占8个字节,但不同类型的变量却占不同的字节数。如果定义指针变量不定义类型,那么它在取*也就是取其中的值得时候,就不知道应该读取几个字节,而定义了类型之后:如果是int类型就读取4个字节,char型就读一个字节。
二、指针实例操作 下面我们用实例来说明“变量、一级指针、二级指针之间的关系”。 我们先定义一个int类型的变量 a,然后再定义一个一级指针变量p,一个二级指针变量p1。我们在前面的介绍中说过所用变量都有地址,所以我们定义指针变量p指向a,指针p1指向p。接下来我们通过打印a、p、p1的地址来看看它们之间有什么关系。 打印如下:
通过程序的运行及打印的内容让我们的猜想得到了验证,接下来我们总结一下变量、一级指针、二级指针之间的关系。 假设这是一个内存分配空间,因为我们定义了变量a,一级指针变量p,二级指针变量p1。由于程序中有一下语句使得它们之间有了关系。 int *p=&a; 表明定义了一个指针变量p并且把变量a的地址存储到了指针变量p中
int **p1=&p; 表明定义了一个二级指针变量p1并且把指针变量p的地址存储到了二级指针变量p1中 通过上面的分析,我们可以说p指向了a,p1指向了p,也就是 p等于变量a的地址:p=0x000010 p1等于指针变量p的地址:p1=0x000020 在第一部分我们已经说明了*号的用法,只有在定义指针变量的时候*是表示在定义一个指针变量,如果没有*就是在定义一个普通变量。 其他位置出现的*都是表示取存储空间的值。如:*p 表示取p中存储的内容(值)。 就拿本例来说明: 由上图可以知道指针变量p指向变量a或可以说成为指针变量p存储着变量a的地址,因为*号只是表示*号后面的变量名是一个指针变量,所以 p=0x000010 那么*p表示什么?因为在上面说过,*在非定义指针变量时出现是表示取地址中的内容(值)。所以 *p=*(0x000010)=4
就按照这样的思路来分析一下二级指针p1 同理p1中存储的是p的地址,所以
p1=0x000020
那么*p1是什么意思?按我们分析思路*表示取p1中的内容,因为p1=0x000020也就是取0x000020中的内容(值)。所以 *p1=*(0x000020)=0x000010 所以*p1=0x000010 那么**p1是什么意思?继续按我们思路来分析**p1可以表示为*(*p1)又因为*p1=0x000010所以可以变成 *(0x000010),这又表示取地址0x000010中存储的内容。所以 **p1=*(*p1)=*(0x000010)=4 总结: 以上分析了变量、一级指针变量、二级指针变量之间的关系,只要按照这样的思路来学习、分析指针就不会乱,总结这些思路和分析方法是为了更好的学习接下来的数组与指针、指针数组、字符串指针等等。 |