当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:54:00  来源:本站整理

<b>C++指针利用办法解惑</b>[VC/C++编程]

赞助商链接



  本文“<b>C++指针利用办法解惑</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

在下列函数声明中,为什么要同时利用*和&标记?以及什么场所利用这种声明方法?

void func1( MYCLASS *&pBuildingElement );

论坛中常常有人问到这样的问题.本文试图通过一些实际的指针利用经验来注释这个问题.

细心看一下这种声明方法,确切有点让人迷惑.在某种意义上,"*"和"&"是意思相对的两个东西,把它们放在一同有什么意义呢?.为了理解指针的这种做法,我们先复习一下C/C++编程中无所不在的指针概念.我们都知道MYCLASS*的意思:指向某个对象的指针,此对象的范例为MYCLASS.

void func1(MYCLASS *pMyClass);

// 比方:

MYCLASS* p = new MYCLASS;
   func1(p);

上面这段代码的这种处理办法想必谁都用过,成立一个MYCLASS对象,然后将它传入func1函数.目前假定此函数要改正pMyClass:

void func1(MYCLASS *pMyClass)
   {
     DoSomething(pMyClass);
     pMyClass = // 别的对象的指针
   }

第二条语句在函数历程中只改正了pMyClass的值.并没有改正调用者的变量p的值.假如p指向某个位于地址0x008a00的对象,当func1返回时,它仍旧指向这个特定的对象.(除非func1有bug将堆弄乱了,完好有这种大概.)

目前假定你想要在func1中改正p的值.这是你的权利.调用者传入一个指针,然后函数给这个指针赋值.以往普通都是传双指针,即指针的指针,比方,CMyClass**.

MYCLASS* p = NULL;
   func1(&p);

   void func1(MYCLASS** pMyClass);
   {
     *pMyClass = new MYCLASS;
     ……
   }

调用func1之后,p指向新的对象.在COM编程中,你处处城市碰到这样的用法--比方在查询对象接口的QueryInterface函数中:

interface ISomeInterface {
     HRESULT QueryInterface(IID &iid, void** ppvObj);
     ……
   };
   LPSOMEINTERFACE p=NULL;
   pOb->QueryInterface(IID_SOMEINTERFACE, &p);

此处,p是SOMEINTERFACE范例的指针,所以&p就是指针的指针,在QueryInterface返回的时刻,假如调用成功,则变量p包含一个指向新的接口的指针.

假如你理解指针的指针,那么你必定就理解指针引用,因为它们美满是一回事.假如你象下面这样声明函数:

void func1(MYCLASS *&pMyClass);
   {
     pMyClass = new MYCLASS;
     ……
   }

其实,它和前面所讲得指针的指针例子是一码事,只是语法有所差别.传送的时刻不用传p的地址&p,而是直接传p本身:

MYCLASS* p = NULL;
func1(p);

在调用之后,p指向一个新的对象.普通来说,引用的原理或多或少就象一个指针,从语法上看它就是一个普通变量.所以只要你碰到*&,就应当想到**.也就是说这个函数改正或大概改正调用者的指针,而调用者象普通变量一样传送这个指针,不利用地址操作符&.

至于说什么场所要利用这种办法,我会说,极少.MFC在其调集类顶用到了它--比方,CObList,它是一个CObjects指针列表.

class CObList : public CObject {
     ……
     // 获得/改正指定位置的元素
     CObject*& GetAt(POSITION position);
     CObject* GetAt(POSITION position) const;
   };

这里有两个GetAt函数,功效都是获得给定位置的元素.辨别安在呢?

辨别在于一个让你改正列表中的对象,另一个则不行.所以假如你写成下面这样:

CObject* pObj = mylist.GetAt(pos);

则pObj是列表中某个对象的指针,假如接着改变pObj的值:pObj = pSomeOtherObj;这并改变不了在位置pos处的对象地址,而仅仅是改变了变量pObj.但是,假如你写成下面这样:CObject*& rpObj = mylist.GetAt(pos); 目前,rpObj是引用一个列表中的对象的指针,所以当改变rpObj时,也会改变列表中位置pos处的对象地址--换句话说,替换了这个对象.这就是为什么CObList会有两个GetAt函数的来由.一个可以改正指针的值,另一个则不能.注意我在此说的是指针,不是对象本身.这两个函数都可以改正对象,但只有*&版本可以替换对象.

在C/C++中引用是很重要的,同时也是高效的处理手段.所以要想成为C/C++高手,对引用的概念没有透彻的理解和纯熟的利用是不行的.


  以上是“<b>C++指针利用办法解惑</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .