1、一.对于众多人提出的 c/c+中指针难学的问题做个总结: 指针学习不好关键是概念不清造成的,说的简单点就是书没有认真看,指针的学习犹如人在学习饶口令不多看多学多练是不行的,下面是两个很经典的例子,很多书上都有,对于学习的重点在于理解*x 和 x 的理解,他们并不相同,*x 所表示的其实就是变量 a 本身,x 表示的是变量 a 在内存中的地址,如果想明白可以输出观察 cout main() int a,b; /* 定义 a,b 两个整形变量用于输入两个整数 */ int *point_1,*point_2,*temp_point; /* 定义三个指针变量 */ scanf(“%d,%d“, /*
2、 格式化输入 a,b 的值 */ point_1= /* 把指针变量 point_1 的值指向变量 a 的地址 */ point_2= /* 把指针变量 point_2 的值指向变量 b 的地址 */ if (a main() int a,b; /* 定义 a,b 两个整形变量用于输入两个整数 */ int *point_1,*point_2; /* 定义三个指针变量 */ scanf(“%d,%d“, /* 格式化输入 a,b 的值 */ point_1 = /* 把指针变量 point_1 的值指向变量 a 的地址 */ point_2 = /* 把指针变量 point_2 的值指向变量
3、b 的地址 */ compositor(point_1,point_2); /* 调用自定义的排序涵数,把 a,b 的地址传递给 point_1 和 point_2 */ printf(“%d,%d“,a,b); /* 打印出 a,b 的值 */ static compositor(p1,p2) int *p1,*p2; /* 定义形式参数 p1,p2 为指针变量 */ int temp; /* 建立临时存储变量 */ if (*p1QueryInterface(IID_SOMEINTERFACE, int * pn = 1.2 成员数据指针有如下的结构:struct MyStructint
4、key;int value;现在有一个结构对象:MyStruct me;MyStruct* pMe = 我们需要 value 成员的地址,我们可以:int * pValue = /或int * pValue = 当然了,这个指针仍然是属于第一种范筹-常规数据指针。好了,我们现在需要一种指针,它指向 MyStruct 中的任一数据成员,那么它应该是这样的子:int MyStruct:* pMV = /或int MyStruct:* pMK = 这种指针的用途是用于取得结构成员在结构内的地址。我们可以通过该指针来访问成员数据:int value = pMe-*pMV; / 取得 pMe 的 val
5、ue 成员数据。int key = me.*pMK; / 取得 me 的 key 成员数据。那么,在什么场合下会使用到成员数据指针呢?确实,成员指针本来就不是一种很常用的指针。不过,在某些时候还是很有用处的。我们先来看看下面的一个函数:int sum(MyStruct* objs, int MyStruct:* pm, int count)int result = 0;for(int i = 0; i QueryInterface(IID_SOMEINTERFACE, 此处,p 是 SOMEINTERFACE 类型的指针,所以 pMyClass = new MYCLASS; 其实,它和前面所讲
6、得指针的指针例子是一码事,只是语法有所不同。传递的时候不用传 p 的地址 func1(p); 在调用之后,p 指向一个新的对象。一般来讲,引用的原理或多或少就象一个指针,从语法上看它就是一个普通变量。所以只要你碰到* CObject* GetAt(POSITION position) const; ; 这里有两个 GetAt 函数,功能都是获取给定位置的元素。区别何在呢? 区别在于一个让你修改列表中的对象,另一个则不行。所以如果你写成下面这样: CObject* pObj = mylist.GetAt(pos); 则 pObj 是列表中某个对象的指针,如果接着改变 pObj 的值: pObj
7、= pSomeOtherObj; 这并改变不了在位置 pos 处的对象地址,而仅仅是改变了变量 pObj。但是,如果你写成下面这样: CObject* 现在,rpObj 是引用一个列表中的对象的指针,所以当改变 rpObj 时,也会改变列表中位置 pos 处的对象地址-换句话说,替代了这个对象。这就是为什么 CObList 会有两个 GetAt 函数的缘故。一个可以修改指针的值,另一个则不能。注意我在此说的是指针,不是对象本身。这两个函数都可以修改对象,但只有*/指针类型为 int *int *a;/指针类型为 int * int *(*a)8;/指针类型为 int *(*)8 、 指针所指向
8、的类型:是指编译器将把那一片内存所看待成的类型。这里只要把指针声明语句中的指针名字和名字右边的“*”号去掉就可以了,剩下的就是指针所指向的类型。我之所以把他们放在第一位,是因为弄清楚他们是学 c/c+指针的重点,正确理解他们才能使你打好 c/c+的编程基础。 2、 指针的应用传递参数。其实它可以相当于隐式的返回值,这就比 return 的方法更加灵活了,可以返回更多的值,看看下面的例子自然就明白了:#include “iostream.h“void example(int *a1,int +b1;+c1;void main()int *a;int b,c;*a=6;b=7;c=10;example(a,b,c);cout “*a=“*acout “b=“cout “c=“