您的位置:首页 > 编程语言 > C语言/C++

C语言指针回顾(二)理解指针的类型和指针的值

2017-08-02 15:28 483 查看
      指针与引用相比,有很多不同。其一、指针是一个对象,因此允许对指针赋值和拷贝,而且在指针的声明周期内它可以先后指向不同的对象。其二,指针可以不用在定义的时候赋初值,此时,指针拥有一个不确定的值。但是,建议在定义的时候就初始化指针,如果实在不知道指向何处 ,就把它初始化为nullptr或者0。下面说四个问题:指针的类型、指针所指向的类型、指针的值、指针本身所占的内存区。
      1、指针的类型
      从C语言语法的角度,判断指针的类型,直接把指针的名字去掉,剩下部分就是指针的类型。比如 int * p,指针的类型就是 int *,char ** p 指针的类型就是 char **,再比如,int (*p)[3] ,指针的类型就是 int (*)[3]。
     2、指针所指向的类型
      从C语言语法的角度,判断指针所指向的类型,把指针名字以及指针左边那个 * 去掉,剩下的部分就是指针指向的类型。比如说 int * p,指针 p 指向的类型是 int 类型。再比如,char ** p,指针 p 指向的类型为 char *.
      这里有一点要说一下,很多写的很差的书,总是把“指针的类型”和“指针所指向的类型”两个概念混淆,总让人摸不着头脑,迷迷糊糊。但是,把两者区分开来,非常有必要。
      3、指针的值(指针指向的内存区 / 指针指向的地址)
     指针的值是一个地址,而不是一般的数值,比如,32位程序里内存地址全部都是32位长。指针所指向的内存区,就是从指针的值所代表的内存区开始,长度为 sizeof (指针指向的类型所占空间,比如char 类型,sizeof就是一个字节) 的一片内存区。举个例子,我说指针的值是 XX,就是说指针指向了以XX 为首地址的一片内存区域。如果说指针指向了某块内存区域,就相当于说了指针的值是这块内存区域的首地址。
     这里有点要说明,指针所指向的内存区和指针所指向的类型完全不是一个概念。在定义指针变量的时候,指针所指向的类型就是确定的了,但是,只有给它初始化了的时候,它指向的内存区才是存在的。
      指针的值(即地址)应该属于以下四种状态之一:
      (1)指向一个对象
      (2)指向紧邻对象所占空间的下一个位置
      (3)空指针,意味着没有指向任何对象
      (4)无效指针,除以上三种情况的其它值。试图拷贝或者引用其它无效指针的值都将引起错误,但是编译器不负责检查。也就是说,编译能通过。
      
      4、指针本身所占的内存区
      用 sizeof 输出一下就可以了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: