易码技术论坛

 找回密码
 加入易码
搜索
查看: 167349|回复: 0

[教程] c++中的指针们——简简介

[复制链接]
发表于 2006-7-22 00:15:15 | 显示全部楼层 |阅读模式
说起指针来,c程序员一定不陌生,它既是效率的源泉,也是代码恶烂的根源之一。现在发展到c++,事情发展得更为猛烈,c++不但几乎原封不动的继承了c的一切,在指针这件事情上,还玩出了更多花样,我也尽量分分类,做个总结。c++指针博大精深,这里只是以最简单的方式介绍最简单的语法,而且只是个人经验之谈,还是愿者上钩


1.普通的变量指针:

定义方式:T *pT=&a(T为原始类型,如int,long,double,char等)

解引用方式:*pT

这种指针还是比较简单的,里面的值就是一个变量的地址,&为取地址符,*同时被用来定义指向类型T的指针和引用指针指向的值

1.5 T是指针

  这个其实没什么,指针类型的变量也不过是个变量,也是有地址的,所以就有指向指针的指针

  定义:int** ppInt;   int* pInt; int a;

            ppInt=&pInt;

  两级的也是会比较常用,再多了就没见过了,不过也有可能用到。善用typedef是王道

2.指向结构的指针

   定义: struct A{ int a1; double a2};

           A* t;

   这种指针可以解引用来使用其结构:

          (*t).a1 这里括号不能少,因为.的优先级比较高

   但是太麻烦,于是可以这样:

         t->a1 表示(*t).a1,这是指向结构的指针的一种用法。

3.指向数组的指针:

   定义:int (*pa)[10];定义了个指向一个拥有10个整形元素的数组的指针。

   强烈建议大家不要使用这种东西,和二级指针几乎一个作用。

4.函数指针:

  定义:int f(int x); 先定义一个函数

            int (*pf)(int x) ; 这里pf就是一个指向拥有一个整形变量,并且返回int值得函数的指针

  赋值:pf=f; 或 pf=&f

  引用:int rValue=pf(3); 或 int rValue=(*pf)(3) 也就是说,函数指针和函数名在看起来是差不多的东西。不过是不是标准就不记得了……

  建议:使用的时候还是要typedef一下,会清晰很多:

            typedef int (* FUN_PTR)(int) 这里FUN_PTR就是一个 带有一个整形参量并返回一个整数的函数 的指针类型。

            然后定义 FUN_PTR pf=&f;

上面都是c里面的东西,下面来点c++

1.指向对象的指针:

    class A

   {

     public:

        int a1; int a2;  int helloPtr(int t);

   }

    A* pa;

   引用:规则和struct一样,也可以使用->,值得注意的是,->同样可以引用函数:

              int rValue=pa->helloPtr(3);

2.指向成员的指针:

  定义: 还是使用上面的class A

        int A::* pAMember;  这里的pAMember就是一个指向A中整形成员的指针;

  赋值: pAMember=&A::a1; 这里就将pAMember指向了A中的a1成员,注意,这里没有将pAMember绑定到任何一个对象上,它里面只是这个成员a1的偏移量

  引用: A a,*pa ; 这里定义了一个A的对象和指针

             假定有上面的赋值,那么,为了用成员指针引用a1,可以这样:

             a.*pAMember;

             pa->*pAMember

  注意: 1.对于成员函数指针的定义是一样的

                  int (A::* pAFun) (int) 定义了一个 指向A 中 (拥有一个整形参数并返回一个整数)的成员函数的指针

                 pAFun=&A::hellpPtr; 将这个指针指向成员hellpPtr;

                int rValue=(a.*pAFun)(3);     int rValue2=  (a->*pAFun)(3) 将调用helloPtr;

              2.虚函数是可以定义指针的,并且使用虚函数指针可以有多态效果

              3.使用时要用typedef

              4.静态成员函数指针的定义和普通函数一样,但是赋值的时候要加上类名和::运算符:

                假设类A有一个static函数

                 static void fs(int a)

               那么定义

               void(*a)(int);

              赋值:

                a=&A::fs



没了,就想到这么多,想到了再加把

参考:
http://www.itepub.net/html/kaifajingcui/C___VC/2006/0514/32973.html
http://www.google.com

您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2025-8-24 06:23 , Processed in 0.009482 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表