设为首页 加入收藏

TOP

2.3.2 指针(3)
2013-10-07 16:26:41 来源: 作者: 【 】 浏览:83
Tags:2.3.2 指针

2.3.2  指针(3)

任何非0指针对应的条件值都是true。

对于两个类型相同的合法指针,可以用相等操作符(==)或不相等操作符(!=)来比较它们,比较的结果是布尔类型。如果两个指针存放的地址值相同,则它们相等;反之它们不相等。这里两个指针存放的地址值相同(两个指针相等)有三种可能:它们都为空、都指向同一个对象,或者都指向了同一个对象的下一地址。需要注意的是,一个指针指向某对象,同时另一个指针指向另外对象的下一地址,此时也有可能出现这两个指针值相同的情况,即指针相等。

因为上述操作要用到指针的值,所以不论是作为条件出现还是参与比较运算,都必须使用合法指针,使用非法指针作为条件或进行比较都会引发不可预计的后果。

3.5.3节(第117页)将介绍更多关于指针的操作。

void* 指针

void*是一种特殊的指针类型,可用于存放任意对象的地址。一个void*指针存放着一个地址,这一点和其他指针类似。不同的是,我们对该地址中到底是个什么类型的对象并不了解:
 

  1. double obj = 3.14, *pd = &obj;  
  2.                     // 正确:void*能存放任意类型对象的地址  
  3. void *pv = &obj;        // obj可以是任意类型的对象  
  4. pv = pd;            // pv可以存放任意类型的指针 

利用void*指针能做的事儿比较有限:拿它和别的指针比较、作为函数的输入或输出,或者赋给另外一个void*指针。不能直接操作void*指针所指的对象,因为我们并不知道这个对象到底是什么类型,也就无法确定能在这个对象上做哪些操作。

概括说来,以void*的视角来看内存空间也就仅仅是内存空间,没办法访问内存空间中所存的对象,关于这点将在19.1.1节(第821页)有更详细的介绍,4.11.3节(第163页)将讲述获取void*指针所存地址的方法。

2.3.2节练习

练习2.18:编写代码分别更改指针的值以及指针所指对象的值。

练习2.19:说明指针和引用的主要区别。

练习2.20:请叙述下面这段代码的作用。

  1. int i = 42;  
  2. int *p1 = &i;  
  3. *p1 = *p1 * *p1; 

练习2.21:请解释下述定义。在这些定义中有非法的吗?如果有,为什么?

  1. int i = 0

(a) double* dp = &i; (b) int *ip = i; (c) int *p = &i;

练习2.22:假设p是一个int型指针,请说明下述代码的含义。

  1. if (p) // ...  
  2. if (*p) // ...  

练习2.23:给定指针p,你能知道它是否指向了一个合法的对象吗?如果能,叙述判断的思路;如果不能,也请说明原因。

练习2.24:在下面这段代码中为什么p合法而lp非法?

  1. int i = 42;     void *p = &i;   long *lp = &i; 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇2.3.2 指针(2) 下一篇2.3.3 理解复合类型的声明

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Redis 分布式锁全解 (2025-12-25 17:19:51)
·SpringBoot 整合 Red (2025-12-25 17:19:48)
·MongoDB 索引 - 菜鸟 (2025-12-25 17:19:45)
·What Is Linux (2025-12-25 16:57:17)
·Linux小白必备:超全 (2025-12-25 16:57:14)