??xml version="1.0" encoding="utf-8" standalone="yes"?>免费在线超碰,日本女优在线视频一区二区,中文字幕在线视频不卡http://www.aygfsteel.com/mlh123caoer/category/17499.html无ؓ(f)则可为,无ؓ(f)则至深! zh-cnMon, 27 Aug 2007 09:04:23 GMTMon, 27 Aug 2007 09:04:23 GMT60国外开源网站聚?/title><link>http://www.aygfsteel.com/mlh123caoer/archive/2007/08/25/139337.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Sat, 25 Aug 2007 15:16:00 GMT</pubDate><guid>http://www.aygfsteel.com/mlh123caoer/archive/2007/08/25/139337.html</guid><wfw:comment>http://www.aygfsteel.com/mlh123caoer/comments/139337.html</wfw:comment><comments>http://www.aygfsteel.com/mlh123caoer/archive/2007/08/25/139337.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.aygfsteel.com/mlh123caoer/comments/commentRss/139337.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/mlh123caoer/services/trackbacks/139337.html</trackback:ping><description><![CDATA[<p>sourceforge <a >http://www.sourceforge.net</a><br>java.net <a >http://www.java.net</a></p> <p><a >www.eclipse.org</a></p> <p><a >www.opensource.org</a><br></p> <p><span lang=EN-US style="FONT-FAMILY: SimSun; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun"><a >http://strutstestcase.sourceforge.net</a> <font color=#002c99>(StrutsTestCase</font></span><span style="FONT-FAMILY: SimSun; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun">是基?span lang=EN-US>Junit</span>的一个方便测?span lang=EN-US>struts</span>框架的测试框?<br><br></span>Lomboz <a >http://www.objectlearn.com/index.jsp</a> (J2EE plugin for Eclipse)<br>htmlArea <a >http://sourceforge.net/projects/itools-htmlarea/</a> (所见即所得的在线HTML~辑?<br>XmlBuddy <a >http://www.xmlbuddy.com/</a> (XML Editor plugin for Eclipse)<br>JFreeChart <a >http://www.jfree.org/</a> (用于生成图表的项?<br>EclipseME <a >http://eclipseme.sourceforge.net/</a> (J2ME Developmnt Plugin for Eclipse)<br>mvnForum <a >http://sourceforge.net/projects/mvnforum/</a> (论坛)<br>jChatBox <a >http://www.javazoom.net/index.shtml</a> (用servlet实现的WEB聊天引擎)<br>POI <a >http://jakarta.apache.org/poi/index.html</a> (用于处理Excel,WORD{文档的目)<br>FileUpload <a >http://jakarta.apache.org/commons/fileupload/</a> (用于处理HTTP文g上传得项?<br>PDFBox <a >http://sourceforge.net/projects/pdfbox/</a> (处理PDF文档的项?<br>Lucene <a >http://jakarta.apache.org/lucene/index.html</a> (搜烦(ch)引擎)<br>Digester <a >http://jakarta.apache.org/commons/digester/</a> (处理XML信息的项?<br>DBCP <a >http://jakarta.apache.org/commons/dbcp/</a> (数据库连接池)<br>AXIS <a >http://ws.apache.org/axis/</a> (WebService 的实现框?<br>Jetspeed <a >http://portals.apache.org/jetspeed-1/</a> (Portal)<br>HSQLDB <a >http://sourceforge.net/projects/hsqldb/</a> (Im memory Database Engine)<br>CEWOLF <a >http://sourceforge.net/projects/cewolf/</a> (一套标{ֺ实现Web报表,使用的是jFreeChart引擎)<br>Struts Menu <a >http://sourceforge.net/projects/struts-menu/</a> (ZStruts的Web菜单目)<br>htmlparser <a >http://sourceforge.net/projects/htmlparser/</a> (用于解析HTML信息的项?<br>Mondrian <a >http://sourceforge.net/projects/mondrian/(Open</a> Source OLAP Database)<br>ProGuard <a >http://sourceforge.net/projects/proguard/(Java</a>的؜淆器)<br>InfoGlue <a >http://sourceforge.net/projects/infoglue/</a> (J2EE 内容理pȝ)<br>JPivot <a >http://sourceforge.net/projects/jpivot/</a> (ZWEB的OLAP 展现)<br><a >http://java-source.net/</a></p> <p>(5)几个常用JAVA开源项目的地址荟萃:<br>Lomboz <a >http://www.objectlearn.com/index.jsp</a> (J2EE plugin for Eclipse)<br>htmlArea <a >http://sourceforge.net/projects/itools-htmlarea/</a> (所见即所得的在线HTML~辑?<br>XmlBuddy <a >http://www.xmlbuddy.com/</a> (XML Editor plugin for Eclipse)<br>JFreeChart <a >http://www.jfree.org/</a> (用于生成图表的项?<br>EclipseME <a >http://eclipseme.sourceforge.net/</a> (J2ME Developmnt Plugin for Eclipse)<br>mvnForum <a >http://sourceforge.net/projects/mvnforum/</a> (论坛)<br>jChatBox <a >http://www.javazoom.net/index.shtml</a> (用servlet实现的WEB聊天引擎)<br>POI <a >http://jakarta.apache.org/poi/index.html</a> (用于处理Excel,WORD{文档的目)<br>FileUpload <a >http://jakarta.apache.org/commons/fileupload/</a> (用于处理HTTP文g上传得项?<br>PDFBox <a >http://sourceforge.net/projects/pdfbox/</a> (处理PDF文档的项?<br>Lucene <a >http://jakarta.apache.org/lucene/index.html</a> (搜烦(ch)引擎)<br>Digester <a >http://jakarta.apache.org/commons/digester/</a> (处理XML信息的项?<br>DBCP <a >http://jakarta.apache.org/commons/dbcp/</a> (数据库连接池)<br>AXIS <a >http://ws.apache.org/axis/</a> (WebService 的实现框?<br>Jetspeed <a >http://portals.apache.org/jetspeed-1/</a> (Portal)<br>HSQLDB <a >http://sourceforge.net/projects/hsqldb/</a> (Im memory Database Engine)<br>CEWOLF <a >http://sourceforge.net/projects/cewolf/</a>(一套标{ֺ实现Web报表,使用的是jFreeChart?<br>Struts Menu <a >http://sourceforge.net/projects/struts-menu/</a> (ZStruts的Web菜单目)<br>htmlparser <a >http://sourceforge.net/projects/htmlparser/</a> (用于解析HTML信息的项?<br>Mondrian <a >http://sourceforge.net/projects/mondrian/</a> (Open Source OLAPdatabase)<br>ProGuard <a >http://sourceforge.net/projects/proguard/</a> (Java的؜淆器)<br>InfoGlue <a >http://sourceforge.net/projects/infoglue/</a> (J2EE 内容理pȝ)<br>JPivot <a >http://sourceforge.net/projects/jpivot/</a> (ZWEB的OLAP 展现)<br>HttpClient <a >http://jakarta.apache.org/commons/httpclient/</a> 处理http客户端的接口</p><img src ="http://www.aygfsteel.com/mlh123caoer/aggbug/139337.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/mlh123caoer/" target="_blank">草儿</a> 2007-08-25 23:16 <a href="http://www.aygfsteel.com/mlh123caoer/archive/2007/08/25/139337.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>指针专题 http://www.aygfsteel.com/mlh123caoer/archive/2006/11/20/82250.html草儿草儿Mon, 20 Nov 2006 06:10:00 GMThttp://www.aygfsteel.com/mlh123caoer/archive/2006/11/20/82250.htmlhttp://www.aygfsteel.com/mlh123caoer/comments/82250.htmlhttp://www.aygfsteel.com/mlh123caoer/archive/2006/11/20/82250.html#Feedback0http://www.aygfsteel.com/mlh123caoer/comments/commentRss/82250.htmlhttp://www.aygfsteel.com/mlh123caoer/services/trackbacks/82250.html数组的指针、指针数l以?qing)指向指针的指?/strong>

  考虑数组的指针的时候我们要同时考虑cd和维数这两个属性。换一句话Q就是说一个数l排除在其中存储的数|那么可以用类型和l数来位|表CZ的种cR?/p>

AQ一l数l?br />  在c和c++中数l的指针是数组的v始地址Q也q一个元素的地址Q,而且标准文档规定数组名代表数l的地址Q这是地址数值层面的数组表示Q。例如:(x)

int a[10];int *p;

p=&a[0]//和p=a是等L(fng)Q?br />
  因ؓ(f)a是数l名Q所以他是该数组的地址Q同时因为第一个元素ؓ(f)a[0]Q那?amp;a[0]也代表了(jin)该数l的地址。但是我们是不是p一个数l名和该数组的第一个元素的&q算是一回事呢?在一l的时候当时是的,但是在高l的时候,我们要考虑到维数给数组带来的媄(jing)响?br />  a[10]是一个数l,a是数l名Q它是一个包?0个intcd的数l类型,不是一般的指针变量噢!Q虽然标准文档规定在c++中从int[]到int*直接转换是可以的Q在使用的时候似乎在函数的参Cؓ(f)指针的时候,我们该数组名赋值没有Q何异P(j)Qa代表数组的首地址Q在数字层面和a[10]的地址一栗这h们就可以使用指针变量以及(qing)a来操作这个数l了(jin)?br />所以我们要注意以下问题Q?/p>

Q?Q?p[i]和a[i]都是代表该数l的Wi+1个元素;
Q?Q?p+i和a+i代表?jin)第i+1个元素的地址Q所以我们也可以使用 *Qp+IQ和*Qa+IQ来引用对象元素Q?br />Q?Qp+1不是对于指针数量上加一Q而是表示从当前的位置跌当前指针指向cd长度的空_(d)对于win32的int?byteQ?/p>

B)多维数组
  对于二维数组a[4][6];׃数组名代表数l的起始地址Q所以aQ第一层)(j)和第一个元素a[0][0]地址的数字是相同的,但是意义却是不同的。对于该数组我们可以理解为:(x)a的一l数l(W一层)(j)Q它有四个元素a[0]、a[1]、a[2]、a[3]Q第二层Q,而每个元素又含有6个元素a[0][0],a[0][1],a[0][2],a[0][3],a[0][4]Qa[0][5]Q第三层Q?…到此我们终于访问到?jin)每个元素?jin)Q这个过E我们经历了(jin)Qa->a[0]->a[0][0]Q?br />  整体来讲Qa是一??列的二维数组Qa表示它指向的数组的首地址Q第一个元素地址&a[0]Q?同时a[0]指向一行,它是q个行的名字Q和该行的第一个元素的首地址相同Q第一个元素ؓ(f)地址&a[0][0]Q)(j)。所以从数字角度_(d)(x)a、a[0]?amp;a[0][0]是相同的Q但是他们所处的层次是不同的?br />  既然a代表二维数组Q那么a+ipC它的第i+1个元?Qa+iQ的地址Q而在二维数组?br />*Qa+iQ又指向一个数l,*Qa+iQ?j表示q个数组的第j+1个元素的地址Q所以要讉Kq个元素可以使用 *Q?Qa+iQ?jQ(也就是a[i][j]Q?br />他们的示意图为(虚线代表不是实际存在的)(j)Q?/p>

对照q个图,如下的一些说法都是正的Q对于a[4][6]Q:(x)

  • a是一个数l类型,*a指向一个数l;
  • a+i指向一个数l;
  • a?a?amp;a[0][0]数值相同;
  • a[i]+j?Qa+iQ?j是同一个概念;

  ȝ一下就是:(x)我们对于二维指针aQ他指向数组a[0Q?Q?Q?]Q?Q可以他降U到W二层次Q这?a指向了(jin)W一个真正的数组。对于其他的情况我们也可以采用相同的方式Q对于其他维数和cd的数l我们可以采用相cM的思想?br />
说到指向数组的指针,我们q可以声明一个指针变量让它指向一个数l。例如:(x)

int Q?pQ[5]Q?/pre>

q时p是一个指针,要指向一个含?个intcd元素的数l,指向其他的就?x)出现问题?br />q个时候我们可以用上面的什么东西来初始化呢Q?br />我们可以使用*a,*(a+1)Qa[2]{?br />原因很简单:(x)我们在一个二l的数组中,那么表达方式有上面的怺cM的意义呢Q只有 *a,*(a+1)Qa[2]{,

C)指针数组
  一个指针数l是指一个数l中的每个元素都是一个指针,例如Q?/p>

int *p[10];//而不能是int (*p)[10]

或?/p>

char *p[10];

此时p是一个指针(数g?amp;p[0]一P(j)Q?br />在前面有int t[10]Q?/p>

int * pt=t;//使用pt指向t

那么q里我们用什么指向int *t[10]中的t呢?我们要用一个指针的指针Q?/p>

int **pt=t;

  q是因ؓ(f)Q在int *t[10]中,每个元素是指针,那么同时t又指向这个数l,数组上和&t[0]相同Q也是指向t[0]Q指向一个指针变量,可以说是一个指针的指针?jin),所以自然要?/p>

int **pt;


D)指针的指?br />  一个指针变量内部可以存储一个|q个值是另外一个对象的地址Q所以我们说一个指针变量可以指向一个普通变量,同样q个指针变量也有一个地址Q也是说有一个东西可以指向这个指针变量,然后再通过q个指针变量指向q个对象。那么如何来指向q个指针变量呢?׃指针变量本n已经是一个指针了(jin)Q右|(j)Q那么我们这里就不能用一般的指针?jin),需要在指针上体现出来这些特点,我们需要定义指针的指针Q二重指针)(j)?/p>

int *p1=&i;int**p2=&p1Q?/pre>

l合以上的所有点Q下面是我们常常看到一些匹配(也是l常出错的地方)(j)Q?/p>

int a[3],b[2][3],c,*d[3];void fun1(int *p)Qvoid fun2(int (*p)[3]);void fun3(int **p);void fun4(int p[3]); void fun5(int p[]);void fun6(int p[2][3]);void fun7(int (&p)[3]);

函数 不会(x)产生~译时刻的可能|但逻辑上不一定都对)(j)

Q?span lang="EN-US">b+iQ?/span>

int (*p)(int I,int j)=min;int (*p)(int I,int j)=&min;int (*p)(int I,int j)=0Q?/pre>

B) 函数的指针参?br />  函数指针可以作函数的参数Q例如我们有一个积分的法Q对于不同的数学函数可以q行U分Q我们这里假讑և数都是一元的Q;
那么我们的算法接口可以定义ؓ(f)Q?/p>

template<class T>T integrate( T lower, T upper , T (*)(T)=0 )throw(integrated_exp);

  q里的最后的参数是一个函数的指针Qƈ且被讑֮~省gؓ(f)0。这个函数返回一个|同时需要一个参数。假如加入我们有q样的一个函敎ͼ(x)

double line(double x){ return a*x+b;}

那么我就可以使用?jin)?br />
函数指针q可以作回类型(注意不是函数Q!Q某个特定的函数是不可以作ؓ(f)q回cd的。)(j)假设Q?/p>

typedef int (*PF)(int );PF getProcessMethod( );//true

C) q回指针的函?br />  一个函数的q回是函数的重要接口之一Qc++的一个重要的强大的功能就是能够设计够复杂和好用的用戯定义cd。而同时处理和传递这些类型也是很ȝ(ch)的一件事情,我们不想把我们的旉都花在这些对于我们的实际工作没有很实质帮助的拯上,解决q个问题p依赖我们的接口设计:(x)c和c++都提供了(jin)相应的解x(chng)案,在c++中我们可是用引用,讲他们作为函数的实际参数Q或者我们在函数的实际参C使用一个指针等。同h们还可以使用一个函数返回一个指针:(x)但是q是一个很不好解决的问题!
我们首先Ҏ(gu)出错的是Q将一个局部变量的地址传出来!例如Q?/p>

UserType * Process( ){  UserType ut(param-list);  //process ut;  return &ut;//}

  q个变量在我们的函数l束的时候就被销毁了(jin)Q尽地址可以传出去,但是q个地址已经不存在了(jin)Q已l不能用的东西Q在q个函数之外却不知道Q难免要出错Q?br />同时我还?sh)(x)有一个比较麻?ch)的问题Q用newQ又Ҏ(gu)造成内存泄露

UserType * Process ( ){  UserTpye *put=new UserType(param-list );  //process put;  return put;}

我们在函数内部用了(jin)一个newQ分配了(jin)一个空_(d)q样传出来也是可以!
  是说不?x)发生上面的问题(sh)(jin)。但是用户通常都会(x)忘记在程序的外面在把q个借来的空间还回去Q内存空间就q样泄露?jin)?br />可能也是q些另h无奈的问题,所以很多程序员把函数的参数讑֮为指针或者引用,以此来代替这U向外传输吧QMQ用这U返回指针的函数要小?j)?/p>

三、类成员的指?/strong>

  cL员和一般的外部变量怺比较Q不同就是它所在的域不同,q个域很重要Q它军_?jin)该变量可以使用的范围。那么一个指针如果要指向cȝ成员函数或者成员变量,那么除了(jin)要表辑֮的返回类型、参数列表或者类型之外,那么q要说明它所指向的变量(或者函敎ͼ(j)的域Qؓ(f)?jin)说明该域我们要使用cd限定Q?/p>

class NJUPT{  static double money=20000000;  int num;  public:  NJUPT():num(10){};  int get(){return num;};  double getMoney(){reuturn money;}}

我们定义成员的指针ؓ(f)

int NJUPT:: *p;//指向int型成员变量int (NJUPt::*)p()//指向int f()型成员函数?/pre>

Z(jin)使用q些指针Q我们需要用该cd的变量或者指针?/p>

NJUPT s,*ps;

那么调用的方式ؓ(f)Q?/p>

cout<<s.*p;cout<<(s->*p)();

  q个看v来似乎很奇怪!但是只要你想到我们定义的指针被限定在?jin)类域中了(jin)(我们在开始定义的使用使用?jin)NJUPT:: Q,q么使用也是很自然的?br />  如果一个类q有一些静(rn)态成员变量和?rn)态成员函敎ͼ那么我是否也惌样用呢Q?br />{案是不用,?rn)态成员我们就可以象用外部的普通成员(sh)样定义一个指针或者函数指针来讉K可以了(jin)Q究其原因主要是q个成员的类型性质军_的?/p>

double *p=&NJUPT::money;double (*p)()=&NJUPT::getMoney(): 


草儿 2006-11-20 14:10 发表评论
]]>数组,函数与指?/title><link>http://www.aygfsteel.com/mlh123caoer/archive/2006/11/20/82245.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Mon, 20 Nov 2006 06:05:00 GMT</pubDate><guid>http://www.aygfsteel.com/mlh123caoer/archive/2006/11/20/82245.html</guid><wfw:comment>http://www.aygfsteel.com/mlh123caoer/comments/82245.html</wfw:comment><comments>http://www.aygfsteel.com/mlh123caoer/archive/2006/11/20/82245.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/mlh123caoer/comments/commentRss/82245.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/mlh123caoer/services/trackbacks/82245.html</trackback:ping><description><![CDATA[<p>一 Q关于指针和堆的内存分配 <br />先来介绍一下指?Q 指针一U类型,理论上来说它包含其他变量的地址Q因此有的书上也叫它Q地址变量。既然指针是一个类型,是类型就有大,在达内的服务器上或者普通的QEZQ都是4个字节大?里边只是存储?jin)一个变量的地址而已。不什么类型的指针Qchar * ,int * ,int (*) ,string * ,float * Q都是说明了(jin)本指针所指向的地址I间是什么类型而已Q了(jin)解了(jin)q个基本上所有的问题都好象都变的合理?jin)?<br /><br />在C++中,甌和释攑֠中分配的存贮I间Q分别用new和delete的两个运符来完成:(x) <br />指针cd 指针变量?new 指针cd (初始?Q?<br /> (tng)  (tng)  (tng)  (tng) delete 指针? <br />例如Q?/p> <p>1?int *p=new int(0); <br /> (tng)  (tng)  (tng)它与下列代码序列大体{h(hun)Q?<br />2、int tmp=0, *p=&tmp; <br />区别Qp所指向的变量是由库操作Wnew()分配的,位于内存的堆ZQƈ且该对象未命名?<br />   <br />下面是关于new 操作的说明 Q </p> <p>1、newq算W返回的是一个指向所分配cd变量Q对象)(j)的指针。对所创徏的变量或对象Q都是通过该指针来间接操作的,而动态创建的对象本n没有名字?<br />2、一般定义变量和对象时要用标识符命名Q称命名对象Q而动态的U无名对?h意与栈区中的临时对象的区别,两者完全不同:(x)生命期不同,操作Ҏ(gu)不同Q(f)时变量对E序员是透明??<br />3、堆区是不会(x)在分配时做自动初始化的(包括清零Q,所以必ȝ初始化式(initializer)来显式初始化。new表达式的操作序列如下Q从堆区分配对象Q然后用括号中的值初始化该对象?<br /><br />下面是从堆中甌数组 <br />1、申hl空_(d)(x) <br />指针变量?new cd名[下标表达式]; <br />注意Q“下标表辑ּ”不是常量表辑ּQ即它的g必在~译时确定,可以在运行时定。这是堆的一个非常显著的特点Q有的时候程序员本n都不知道要申误够多内存的时候,堆就变的格外有用?<br />2、释放数l空_(d)(x) <br />delete [ ]指向该数l的指针变量? <br />注意Q方括号非常重要的,如果delete语句中少?jin)方括号Q因~译器认指针是指向数l第一个元素的Q会(x)产生回收不彻底的问题Q只回收?jin)第一个元素所占空_(d)(j)Q我们通常叫它“内存泄霜y(c),加了(jin)Ҏ(gu)号后p{化ؓ(f)指向数组的指针,回收整个数组。delete [ ]的方括号中不需要填数组元素敎ͼpȝ自知。即使写?jin),~译器也忽略?lt;<Think in c++>>上说q以前的delete []Ҏ(gu)号中是必L加个数的Q后来由于很Ҏ(gu)出错Q所以后来的版本改q了(jin)q个~陷?<br />下面是个例子QVC上编译通过 <br />#include<iostream> <br />using namespace std; <br />//#include <iostream.h>  //for VC <br />#include <string.h> <br />void main(){ <br />int n; <br />char *p; <br />cout<<"误入动态数l的元素个数"<<endl; <br />cin>>n; //n在运行时定Q可输入17 <br />p=new char[n]; //甌17个字W(可装8个汉字和一个结束符Q的内存I间strcpy(pc,“堆内存的动态分配?;// <br />cout<<p<<endl; <br />delete []p;//释放pc所指向的n个字W的内存I间return ; } <br /><br />通过指针使堆I间Q编E中的几个可能问?<br /><br />Q.动态分配失败。返回一个空指针QNULLQ,表示发生?jin)异常,堆资源不I分配p|?<br /> (tng)  (tng)data = new double [m]; //甌I间 <br />if ((data ) == 0)…?//或?=NULL <br />Q.指针删除与堆I间释放。删除一个指针pQdelete p;Q实际意思是删除?jin)p所指的目标Q变量或对象{)(j)Q释放了(jin)它所占的堆空_(d)而不是删除p本nQ释攑֠I间后,p成?jin)空?zhn)指针,不能再通过p使用该空_(d)在重新给p赋值前Q也不能再直接用p?<br />Q.内存泄漏Qmemory leakQ和重复释放。new与delete 是配对用的Q?delete只能释放堆空间。如果newq回的指针g失,则所分配的堆I间无法回收Q称内存泄漏Q同一I间重复释放也是危险的,因ؓ(f)该空间可能已另分配,而这个时候又去释攄话,?x)导致一个很难查出来的运行时错误。所以必d善保存newq回的指针,以保证不发生内存泄漏Q也必须保证不会(x)重复释放堆内存空间?<br />Q.动态分配的变量或对象的生命期。无名变量的生命期ƈ不依赖于建立它的作用域,比如在函C建立的动态对象在函数q回后仍可用。我们也U堆I间q_(d)free storeQ就是这个原因。但必须C释放该对象所占堆I间Qƈ只能释放一ơ,在函数内建立Q而在函数外释放是一件很Ҏ(gu)失控的事Q往往?x)出错,所以永q不要在函数体内甌I间Q让调用者释放,q是一个很差的做法。你再怎么心(j)翼也可能会(x)带来错误?<br />cd堆中甌内存 Q?<br />通过new建立的对象要调用构造函敎ͼ通过deletee删除对象要调用析构函数?<br />CGoods *pc; <br />pc=new CGoods;  (tng)//分配堆空_(d)q构造一个无名对?<br /> (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng) //的CGoods对象Q?<br />…? <br />delete pc;  (tng)//先析构,然后内存空间返回给堆;  (tng)  (tng)  (tng)  (tng)堆对象的生命期ƈ不依赖于建立它的作用域,所以除非程序结束,堆对象(无名对象Q的生命期不?x)到期,q且需要显式地用delete语句析构堆对象,上面的堆对象在执行delete语句ӞC++自动调用其析构函数?<br />正因为构造函数可以有参数Q所以new后面c(classQ类型也可以有参数。这些参数即构造函数的参数?<br />但对创徏数组Q则无参敎ͼq只调用~省的构造函数。见下例c说明:(x) <br /><br />class CGoods{ <br /> (tng)  (tng)  (tng)  (tng)  (tng) char Name[21]; <br /> (tng)  (tng)  (tng)  (tng)  (tng) int  (tng)Amount; <br /> (tng)  (tng)  (tng)  (tng)  (tng) float Price; <br /> (tng)  (tng)  (tng)  (tng)  (tng) float Total_value; <br />public: <br /> (tng)CGoods(){}; //~省构造函数。因已有其他构造函敎ͼpȝ不会(x)再自动生成缺省构造,必须昑ּ声明? (tng) CGoods(char* name,int amount ,float price){ <br /> (tng)  (tng)  (tng)  (tng)  (tng)  (tng)strcpy(Name,name); <br /> (tng)  (tng)  (tng)  (tng)  (tng)  (tng)Amount=amount; <br /> (tng)  (tng)  (tng)  (tng)  (tng)  (tng)Price=price; <br /> (tng)  (tng)  (tng)  (tng)  (tng)  (tng)Total_value=price*amount;  } <br /> (tng)  (tng)  (tng)  (tng)  (tng)  (tng)……}Q?/cd明结?<br />下面是调用机制 Q?<br /><br />void main(){ <br /> (tng)int n; <br /> (tng)CGoods *pc,*pc1,*pc2; <br /> (tng)pc=new CGoods(“hello”,10Q?18000); <br /> (tng)//调用三参数构造函? (tng) pc1=new CGoods();  (tng)//调用~省构造函? (tng)cout<<”输入商品类数组元素数?lt;<endl; <br /> (tng)cin>>n; <br /> (tng)pc2=new CGoods[n]; <br />//动态徏立数l,不能初始化,调用nơ缺省构造函? (tng) <br /> (tng)…?<br /> (tng)delete pc; <br /> (tng)delete pc1; <br /> (tng)delete []pc2;  (tng)} <br /><br />甌堆空间之后构造函数运行; <br />释放堆空间之前析构函数运行; <br />再次Q由堆区创徏对象数组Q只能调用缺省的构造函敎ͼ不能调用其他M构造函数。如果没有缺省的构造函敎ͼ则不能创建对象数l?<br /><br />---------------------下面我们再来看一下指针数l和数组指针――――――――――――?<br />如果你想?jin)解指针最好理解以下的公式 Q?<br />(1)int*ptr;//指针所指向的类型是int <br /><br />  (2)char*ptr;//指针所指向的的cd是char <br /><br />  (3)int**ptr;//指针所指向的的cd是int* Q也是一个int * 型指针)(j) <br /><br />  (4)int(*ptr)[3];//指针所指向的的cd是int()[3] //二维指针的声?<br /><br />Q1Q指针数l:(x)一个数l里存放的都是同一个类型的指针Q通常我们把他叫做指针数组?<br />比如 int * a[10];它里Ҏ(gu)?jin)1Q个int * 型变量,׃它是一个数l,已经在栈区分配了(jin)Q0?int * )的空_(d)也就是3Q位Z是4Q个byte,每个I间都可以存放一个int型变量的地址Q这个时候你可以个数l的每一个元素初始化Q在Q或者单独做个@环去初始化它?<br />例子Q?<br />int * a[2]={ new int(3),new int(4) };  (tng)  (tng) //在栈区里声明一个int * 数组Q它的每一个元素都在堆区里甌?jin)一个无名变量,q初始化他们为3和4Q注意此U声明方式具有缺PVC下会(x)报错 <br />例如 Q?<br />int * a[2]={new int[3],new int[3]}; <br />delete a[0]; <br />delet a[10]; <br />但是我不辑ֆ的学生这么写Q可能会(x)造成歧义Q不是好的风|q且在VC中会(x)报错Q应该写成如下 Q?<br />int * a[2]Q?<br />a[0]= new int[3]; <br />a[1]=new int[3]; <br />delete a[0]; <br />delet a[10]; <br />q样甌内存的风格感觉比较符合大家的?fn)惯Q由于是数组Q所以就不可以delete a;~译?x)出警?delete  (tng)a[1]; <br />注意q里 是一个数l,不能delete [] ; <br />Q?Q?Q?数组指针 Q?一个指向一l或者多l数l的指针Q?<br />int * b=new int[10]; 指向一l数l的指针b ; <br />注意Q这个时候释攄间一定要delete [] ,否则?x)造成内存泄露Q?b 成Z(jin)I?zhn)指? <br /><br />int (*b2)[10]=new int[10][10]; 注意Q这里的b2指向?jin)一个二lint型数l的首地址. <br />注意Q在q里Qb2{效于二l数l名Q但没有指出其边界,x(chng)高维的元素数量,但是它的最低维数的元素数量必须要指定!像指向字符的指针,即等效一个字W串,不要把指向字W的指针说成指向字符串的指针。这与数l的嵌套定义怸致?<br />int(*b3) [30] [20];  (tng)//三指针―?gt;指向三维数组的指针; <br />int (*b2) [20];  (tng)  (tng) //二指针Q?<br />b3=new int [1] [20] [30]; <br />b2=new int [30] [20]; <br /> (tng)  (tng)  (tng) 两个数组都是?00个整数组成,前者是只有一个元素的三维数组Q每个元素ؓ(f)30?0列的二维数组Q而另一个是?0个元素的二维数组Q每个元素ؓ(f)20个元素的一l数l?<br /> (tng)  (tng)  (tng) 删除q两个动态数l可用下式:(x) <br />delete [] b3;  (tng)//删除Q释放)(j)三维数组Q?<br />delete [] b2;  (tng)//删除Q释放)(j)二维数组Q?<br />再次重申Q这里的b2的类型是int (*) Q这栯CZ个指向二l数l的指针?<br />b3表示一个指向(指向二维数组的指针)(j)的指针,也就是三U指? <br /><br />Q?3 Q?二指针的指?<br />看下?: <br />int (**p)[2]=new (int(*)[3])[2]; <br /> (tng)  (tng)  (tng)  (tng)p[0]=new int[2][2]; <br /> (tng)  (tng)  (tng)  (tng)p[1]=new int[2][2]; <br /> (tng)  (tng)  (tng)  (tng)p[2]=new int[2][2]; <br /> (tng)  (tng)  (tng)  (tng)delete [] p[0]; <br /> (tng)  (tng)  (tng)  (tng)delete [] p[1]; <br /> (tng)  (tng)  (tng)  (tng)delete [] p[2]; <br /> (tng)  (tng)  (tng)  (tng)delete [] p; <br />注意此地方的指针cd为int (*),到q种问题把外边的[2]先去掉,然后回头先把int ** pQnew int(*)[n]甌出来Q然后再把外边的Q2Q附加上去; <br />p代表?jin)一个指向二U指针的指针Q在它申L(fng)间的时候要注意指针的类型,那就是int (*)代表二指针Q而int (**)֐思义是代表指向二指针的指针了(jin)。既然是指针要在堆里甌I间Q那首先要定义它的范_(d)(x)Qint(*)[n]Q[2]Qn 个这L(fng)二指针Q其中的每一个二U指针的最低维是2个元?Q因定一个二U指针的话,它的最低维数是必须指定的,上边已经提到Q。然后我们又分别为p[0],p[1],p[2]…在堆里分配?jin)空_(d)其要注意的是:(x)在释攑ֆ存的时候一定要为p[0],p[1],p[2],单独delete[] ,否则又会(x)造成内存泄露Q在delete[]p 的时候一定先delete p[0]; delete p[1]Q然后再把给p甌的空间释放掉 delete [] p ……这样会(x)防止内存泄露?<br /><br />Q3Q指针的指针Q?<br />int ** cc=new (int*)[10]; 声明一个1Q个元素的数l,数组每个元素都是一个int *指针Q每个元素还可以单独甌I间Q因为cc的类型是int*型的指针Q所以你要在堆里甌的话p用int *来申P <br />看下边的例子  (tng)(vc & GNU~译器都已经通过)Q?<br /> (tng)  (tng)  (tng)  (tng)int ** a= new int * [2];     //甌两个int * 型的I间 <br /> (tng)  (tng)  (tng)  (tng)a[1]=new int[3];        //为a的第二个元素又申请了(jin)Q个int 型空?a[1]指向?jin)此I间首地址?<br /> (tng)  (tng)  (tng)  (tng)a[0]=new int[4];        ////为a的第一个元素又甌?jin)4个int 型空_(d)a[0] 指向?jin)此I间的首地址?<br /> (tng)  (tng)  (tng)  (tng)int * b; <br /> (tng)  (tng)  (tng)  (tng)a[0][0]=0; <br /> (tng)  (tng)  (tng)  (tng)a[0][1]=1; <br /> (tng)  (tng)  (tng)  (tng)b=a[0]; <br /> (tng) delete [] a[0]       //一定要先释放a[0]Qa[1]的空_(d)否则?x)造成内存泄露.; <br /> (tng)  (tng)  (tng)  (tng)delete [] a[1]; <br /> (tng) delete [] a; <br /> (tng)  (tng)  (tng)  (tng)b++; <br /> (tng)  (tng)  (tng)  (tng)cout<<*b<<endl;  (tng)  (tng)  (tng) //随机?<br />注意 Q因为a 是在堆里甌的无名变量数l,所以在delete 的时候要用delete [] 来释攑ֆ存,但是a的每一个元素又单独甌?jin)空_(d)所以在delete [] a之前要先delete [] ?a[0],a[1],否则又会(x)造成内存泄露. <br />Q4Q?指针数组 Q?<br />    <br />我们再来看看W二U Q二l指针数l?<br />int *(*c)[3]=new int *[3][2]Q?<br />如果你对上边的介l的个种指针cd很熟(zhn)的话,你一眼就能看出来c是个二指针,只不q指向了(jin)一个二lint * 型的数组而已Q也是二维指针数组?<br />例子 Q?<br /> (tng)int *(*b)[10]=new int*[2][10];// <br />b[0][0]=new int[100]; <br />b[0][1]=new int[100]; <br />*b[0][0]=1; <br />cout <<*b[0][0]<<endl;  (tng)  (tng)//打印l果为1 <br />delete [] b[0][0]; <br />delete [] b[0][1]; <br />delete [] b; <br />cout<<*b[0][0]<<endl;  (tng)  (tng)//打印随机?<br /> q里只ؓ(f)大家q是要注意内存泄露的问题Q在q里׃再多说了(jin)?<br />如果看了(jin)上边的文章,大家估计׃(x)很熟(zhn),q个b是一个二l指针,它指向了(jin)一个指针数l?<br /><br />W二U Q?<br />int **d[2];表示一个拥有两个元素数l,每一个元素都是int ** 型,q个指向指针的指针:(x)Q?<br />   d不管怎样变终I也是个数组Q呵呵, <br />   如果你读懂了(jin)上边的,那下边的声明很单了(jin)Q?<br />   d[0]=new int *[10]; <br />   d[1]=new int * [10]; <br />delete [] d[0]; <br />delete [] d[1]; <br /><br />二 Q 函数指针  <br /><br />关于函数指针Q我惛_我们可能需要写个函敎ͼq个函数体内要调用另一个函敎ͼ可是׃目的进度有限,我们不知道要调用什么样的函敎ͼq个时候可能就需要一个函数指针; <br /><br />int a();q个一个函数的声明Q?<br />ing (*b)();q是一个函数指针的声明Q?<br />让我们来分析一下,左边圆括弧中的星h函数指针声明的关键。另外两个元素是函数的返回类型(voidQ和p圆括弧中的入口参敎ͼ本例中参数是I)(j)。注意本例中q没有创建指针变?只是声明?jin)变量类型。目前可以用q个变量cd来创建类型定义名?qing)用sizeof表达式获得函数指针的大小Q?<br />unsigned psize = sizeof (int (*) ()); 获得函数指针的大?<br />// 为函数指针声明类型定?<br />typedef int (*PFUNC) (); <br /><br />PFUNC是一个函数指针,它指向的函数没有输入参数Q返回int。用这个类型定义名可以隐藏复杂的函数指针语法,我本h强烈我们大内弟子使用q种方式来定义; <br /><br />下面是一个例子,一个简单函数指针的回调(在GNU~译器上通过Q在VC上需要改变(sh)个头文gO(jin)K?jin)?j) <br /><br />#include<iostream>  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)//GNU ~译?g++ 实现 <br />using namespace std; <br />/*  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)//vc 的实?<br />#include "stdafx.h" <br />#include <iostream.h> <br />*/ <br /><br />#define DF(F) int F(){  (tng)cout<<"this is in function "<<#F<<endl;\ <br /> (tng)  (tng)  (tng) return 0;  (tng)  (tng)  (tng) \ <br />} <br />//声明定义DF(F)替代 int F()Q函敎ͼ <br />DF(a); DF(b); DF(c); DF(d); DF(e); DF(f); DF(g); DF(h); DF(i);  (tng)  (tng) //声明定义函数 a b c d e f g h i <br /><br />// int (*pfunc)();  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)//一个简单函数指针的声明 <br />typedef int(*FUNC)();  (tng) //一个函数指针类型的声明 <br /><br />FUNC ff[] = {a,b,c,d,e,f,g,h,i};  (tng) //声明一个函数指针数l,q初始化Z上声明的a,b,c,d,e,f,g,h,i函数 <br /><br />FUNC func3(FUNC vv){  (tng)  (tng)//定义函数func3Q传入一个函数指针,q且q回一个同L(fng)型的函数指针 <br /> (tng)  (tng)  (tng) vv(); <br /> (tng)  (tng)  (tng) return vv; <br />} <br /><br />/*FUNC func4(int (*vv)()){  (tng)  (tng)  (tng)//func3的另一U实?<br /> (tng)  (tng)  (tng) vv(); <br /> (tng)  (tng)  (tng) return vv; <br />}*/ <br /><br />int main(){ <br /> (tng)  (tng)  (tng) for(int i=0;i<sizeof(ff)/sizeof (FUNC);i++){  (tng)//循环调用函数指针 <br /> (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng) FUNC r=func3(ff[ i ]); <br /> (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng) cout<<r()<<endl;  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)//输出q回|只是q回? <br /> (tng)  (tng)  (tng) } <br /> (tng)  (tng)  (tng) return 0; <br />} <br />到目前ؓ(f)止,我们只讨Z(jin)函数指针?qing)回调而没有去注意ANSI C/C++的编译器规范。许多编译器有几U调用规范。如在Visual C++中,可以在函数类型前加_cdeclQ_stdcall或者_pascal来表C其调用规范Q默认ؓ(f)_cdeclQ。C++ Builder也支持_fastcall调用规范。调用规范媄(jing)响编译器产生的给定函数名Q参C递的序Q从叛_左或从左到右Q,堆栈清理责QQ调用者或者被调用者)(j)以及(qing)参数传递机Ӟ堆栈QCPU寄存器等Q?<br />好了(jin)Q先到此为止吧,写这文章耗费?jin)基本上快半天的旉了(jin),很多事情q没有做Q等改天有时间再回来整理Q所有的源程序都攑֜openlab3服务器上我的目录下lib/cpp下,大家可以L。不知道的登陆openlab3 然后cd ~chengx/lib/cpp可以看C(jin)?<br /><br />q有很复杂的声明可能也是一U挑(xi)?比如<<Think in c++>>里的 <br />int (*(*f4())[10]();的声?f4是一个返回指针的函数Q该指针指向?jin)含?0个函数指针的数组Q这些函数返回整形|不是q个函数有特别之处,而是Bruce Eckel 说的“从叛_左的辨认规则”是一U很好的Ҏ(gu)Q值得我们d?fn),感谢他?x)) <br /><br />最后我惛_该跟大家说一下,写程序应该就象JERRY所说的Q简单就是美Q我们应该遵循一个原?Q?KISS QKeep It Simple,Stupid ,量保持E序??gu)?Q《Practical C programming》)(j)Q把自己的程序尽量的单明?jin),q是个非帔R常好的习(fn)惯。?br /></p><img src ="http://www.aygfsteel.com/mlh123caoer/aggbug/82245.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/mlh123caoer/" target="_blank">草儿</a> 2006-11-20 14:05 <a href="http://www.aygfsteel.com/mlh123caoer/archive/2006/11/20/82245.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言中的转义字符http://www.aygfsteel.com/mlh123caoer/archive/2006/11/20/82243.html草儿草儿Mon, 20 Nov 2006 06:03:00 GMThttp://www.aygfsteel.com/mlh123caoer/archive/2006/11/20/82243.htmlhttp://www.aygfsteel.com/mlh123caoer/comments/82243.htmlhttp://www.aygfsteel.com/mlh123caoer/archive/2006/11/20/82243.html#Feedback0http://www.aygfsteel.com/mlh123caoer/comments/commentRss/82243.htmlhttp://www.aygfsteel.com/mlh123caoer/services/trackbacks/82243.html在windows自带的超U终端中,如何清屏?
--通过发?x0C(12)卛_实现清屏?br />--在“输入字W串”内容中输入 /x0c

\0 (tng) Q字W串l束标志Q?br />\n (tng) Q换行(ascq?0Q; (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
\t (tng) Q横向蟩| (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
\b (tng) Q退|
\r (tng) Q回车(ascq?3Q;
\f (tng) Q走U换;
\\ (tng) Q字W\Qascq?2Q; (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
\' (tng) Q单引号Q?tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)?
'\"'Q双引号Q?br />\d05Q用8q制表示字符Q?br />\x1cQ用16q制表示字符.



草儿 2006-11-20 14:03 发表评论
]]>
վ֩ģ壺 ͩ| | | Ԫ| | | ±| | ɽ| ٽ| ξ| | ˮ| | | ;| | ̶| | | ʲ| ˼| | | | | | | | | | ͸| | | | | | | ˮ| | |