2、C++的指针作用

[复制链接]
发表于 2026-2-11 04:53:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
目次
1.标题形貌及分析
2.结论

差异范例所产生的指针在C++语言中有什么作用?带着这个疑问,对C++的指针举行简介。
1.标题形貌及分析

在如下的一段代码中,分别有4个指针,这四个指针有什么不一样的地方么?
  1. class ZooAnimal
  2. {
  3. public:
  4.         ZooAnimal();
  5.         virtual ~ZooAnimal();
  6.         //...
  7.         virtual void rotate();
  8. protected:
  9.         int loc;
  10.         string name;
  11. };
  12. ZooAnimal za("Zoey");
  13. ZooAnimal *pza = &za;
  14. int *pi;
  15. Array<string> *pta;
  16. void *ptv;
复制代码
就内存需求的观点而言,没有差异,他们必要有充足的内存存储一个呆板地点,在32位体系中就是32bit。
就所寻址的object是差异,也就是说“指针范例”会辅导编译器怎样表明某个特定地点中的内存巨细和内容。
1)一个指向地点int的整数指针,在32位的呆板上,所涵盖的地点是1000-1003,由于32位呆板上是4Bytes。
2)如果string是传统的8Bytes,那么一个ZooAnimal指针高出地点空间1000-1015,见下图4+8+4。

对于指向1000的void *指针,地点空间巨细和内容我们是不知道的。转换(cast)是一个编译器指令,大部门环境并不改变指针所含有的真正地点。
如今,我们界说一个Bear,他public继续ZooAnimal,我们看看如下的代码的指针作用。
  1. class Bear : public ZooAnimal
  2. {
  3. public:
  4.         Bear();
  5.         ~Bear();
  6.         //...
  7.         void rotate();
  8.         virtual void dance();
  9.         //...
  10. protected:
  11.         enum Dances{...};
  12.         Dances dances_known;
  13.         int cell_block;
  14. };
  15. Bear b("Yogi");
  16. Bear *pb = &b;
  17. Bear &rb = *p;
复制代码
b,pb,rb的内存结构是什么样子的?可以看出Bear object必要24Bytes,也就是ZooAnimal的16Bytes加上Bear所带来的8Bytes。

除了表明对象的结构外,尚有对象的member function访问环境也必要进一步的分析。由于对象的指针,存在作用域,它会根据作用域调用member function。
  1. Bear b;
  2. ZooAnimal *pz = &b;
  3. Bear *pb = &b;
  4. //不合法,cell_block不是ZooAnimal的一个member,
  5. //虽然我们知道pz目前指向一个Bear object
  6. pz->cell_block;
  7. //ok,经过一个显示的downcast操作就没有问题
  8. (static_cast<Bear *>(pz))->cell_block;
  9. //下面这样更好,但它是一个run-time operation(成本高)
  10. if(Bear *pb2 = dynamic_cast<Bear *>(pz))
  11.         pb2->cell_block;
  12. //ok,因为cell_block是Bear的一个member
  13. pb->cell_block;
  14. //将调用Bear的rotate方法
  15. pz->rotate();
复制代码
2.结论

C++指针的作用紧张有两点:
1)“指针范例”会辅导编译器怎样表明某个特定地点中的内存巨细和内容(包罗member data),天生固定的内存结构。
2)“指针范例”会辅导编译器怎样访问member function。

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表