A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 紫荆秋雪 中级黑马   /  2015-7-16 10:02  /  364 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

指针是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
总结:
    以上分析了变量、一级指针变量、二级指针变量之间的关系,只要按照这样的思路来学习、分析指针就不会乱,总结这些思路和分析方法是为了更好的学习接下来的数组与指针、指针数组、字符串指针等等。

2 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报

是自己对指针的理解,希望对你有帮助,谢谢!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马