- 注册时间
- 2005-4-8
- 最后登录
- 1970-1-1
|
说起指针来,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
|
|