C++“指针”学习建议.doc

上传人:大米 文档编号:554856073 上传时间:2024-02-09 格式:DOC 页数:33 大小:139.01KB
返回 下载 相关 举报
C++“指针”学习建议.doc_第1页
第1页 / 共33页
C++“指针”学习建议.doc_第2页
第2页 / 共33页
C++“指针”学习建议.doc_第3页
第3页 / 共33页
C++“指针”学习建议.doc_第4页
第4页 / 共33页
C++“指针”学习建议.doc_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《C++“指针”学习建议.doc》由会员分享,可在线阅读,更多相关《C++“指针”学习建议.doc(33页珍藏版)》请在金锄头文库上搜索。

1、一.对于众多人提出的c/c+中指针难学的问题做个总结: 指针学习不好关键是概念不清造成的,说的简单点就是书没有认真看,指针的学习犹如人在学习饶口令不多看多学多练是不行的,下面是两个很经典的例子,很多书上都有,对于学习的重点在于理解*x和x的理解,他们并不相同,*x所表示的其实就是变量a本身,x表示的是变量a在内存中的地址,如果想明白可以输出观察cout*x|x;,当定义了int *x;后对x=&a的理解的问题。仔细阅读和联系下面的两个例子我想指针问题就不是难点了! #include main() inta,b;/*定义a,b两个整形变量用于输入两个整数*/ int*point_1,*point

2、_2,*temp_point;/*定义三个指针变量*/ scanf(%d,%d,&a,&b);/*格式化输入a,b的值*/ point_1=&a;/*把指针变量point_1的值指向变量a的地址*/ point_2=&b;/*把指针变量point_2的值指向变量b的地址*/ if(ab) temp_point=point_1;/*这里的temp_point是用于临时存储point_1的值也就是变量a的地址的*/ point_1=point_2;/*把point_2的值赋予point_1*/ point_2=temp_point; /*由于point_1的值已经改变无法找到,利用前面临时存储的也

3、就是temp_point找回原point_1的值赋予point_2,打到把point_1和point_2值对换的目的*/ printf(%d,%d,*point_1,*point_2);/*利用*point_1和*point_2也就是分辨指向b和a的方法把值显示屏幕上*/ /*此题需要注意和了解是的此法并没有改变变量a,b的值只是利用指针变量分别存储a和b的地址,然后再把那两个指针变量的值对换一下其实就是存储在指针变量里面a与b的地址对换,在利用*point_1和*point_2的方式把调换后的值显示出来这里的*point_1实际就是a,此中算法并非真的改变a,b的值,而是利用指针进行地址交换

4、达到大小排序的目的.*/ #include main() inta,b;/*定义a,b两个整形变量用于输入两个整数*/ int*point_1,*point_2;/*定义三个指针变量*/ scanf(%d,%d,&a,&b);/*格式化输入a,b的值*/ point_1=&a;/*把指针变量point_1的值指向变量a的地址*/ point_2=&b;/*把指针变量point_2的值指向变量b的地址*/ compositor(point_1,point_2);/*调用自定义的排序涵数,把a,b的地址传递给point_1和point_2*/ printf(%d,%d,a,b);/*打印出a,b的

5、值*/ staticcompositor(p1,p2) int*p1,*p2;/*定义形式参数p1,p2为指针变量*/ inttemp;/*建立临时存储变量*/ if(*p1*p2)/*如果*p1QueryInterface(IID_SOMEINTERFACE, &p); 此处,p是SOMEINTERFACE类型的指针,所以&p便是指针的指针,在QueryInterface返回的时候,如果调用成功,则变量p包含一个指向新的接口的指针。如果你理解指针的指针,那么你肯定就理解指针引用,因为它们完全是一回事。如果你象下面这样声明函数:void func1(MYCLASS *&pMyClass);pM

6、yClass = new MYCLASS; 其实,它和前面所讲得指针的指针例子是一码事,只是语法有所不同。传递的时候不用传p的地址&p,而是直接传p本身:MYCLASS* p = NULL;func1(p);在调用之后,p指向一个新的对象。一般来讲,引用的原理或多或少就象一个指针,从语法上看它就是一个普通变量。所以只要你碰到*&,就应该想到*。也就是说这个函数修改或可能修改调用者的指针,而调用者象普通变量一样传递这个指针,不使用地址操作符&。至于说什么场合要使用这种方法,我会说,极少。MFC在其集合类中用到了它-例如,CObList,它是一个Cobjects指针列表。Class CObList

7、 : public Cobject / 获取/修改指定位置的元素Cobject*& GetAt(POSITION position);Cobject* GetAt(POSITION position) const;这里有两个GetAt函数,功能都是获取给定位置的元素。区别何在呢?区别在于一个让你修改列表中的对象,另一个则不行。所以如果你写成下面这样: Cobject* pObj = mylist.GetAt(pos);则pObj是列表中某个对象的指针,如果接着改变pObj的值: pObj = pSomeOtherObj;这并改变不了在位置pos处的对象地址,而仅仅是改变了变量pObj。但是,如

8、果你写成下面这样: Cobject*& rpObj = mylist.GetAt(pos);现在,rpObj是引用一个列表中的对象的指针,所以当改变rpObj时,也会改变列表中位置pos处的对象地址-换句话说,替代了这个对象。这就是为什么CObList会有两个GetAt函数的缘故。一个可以修改指针的值,另一个则不能。注意我在此说的是指针,不是对象本身。这两个函数都可以修改对象,但只有*&版本可以替代对象。 在C/C+中引用是很重要的,同时也是高效的处理手段。所以要想成为C/C+高手,对引用的概念没有透彻的理解和熟练的应用是不行的。 三数据指针在C/C+语言中一直是很受宠的;几乎找不到一个不使用

9、指针的C/C+应用。用于存储数据和程序的地址,这是指针的基本功能。用于指向整型数,用整数指针(int*);指向浮点数用浮点数指针(float*);指向结构,用对应的结构指针(struct xxx *);指向任意地址,用无类型指针(void*)。 有时候,我们需要一些通用的指针。在C语言当中,(void*) 可以代表一切;但是在C+中,我们还有一些比较特殊的指针,无法用(void*)来表示。事实上,在C+中,想找到一个通用的指针,特别是通用的函数指针简直是一个“不可能任务”。 C+是一种静态类型的语言,类型安全在C+中举足轻重。在C语言中,你可以用void*来指向一切;但在C+中,void*并不

10、能指向一切,就算能,也失去了类型安全的意义了。类型安全往往能帮我们找出程序中潜在的一些BUG。 下面我们来探讨一下,C+中如何存储各种类型数据的指针。C+指针探讨 (一)数据指针 沐枫网志 1. 数据指针 数据指针分为两种:常规数据指针和成员数据指针 1.1 常规数据指针 这个不用说明了,和C语言一样,定义、赋值是很简单明了的。常见的有:int*, double* 等等。 如:intvalue=123;int*pn=&value; 1.2 成员数据指针 有如下的结构:structMyStructintkey;intvalue; 现在有一个结构对象:MyStructme; MyStruct* pMe = &me; 我们需要 value 成员的地址,我们可以:int*pValue=&me.value; /或 int* pValue = &pMe-value; 当然了,这个指针仍然是属于第一种范筹-常规数据指针。 好了,我们现在需要一种指针,它指向MyStruct中的任一数据成员,那么它应该是这样的子:intMyStruct:*pM

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号