??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲性久久久影院,国内精品伊人久久久久妇,国产综合久久久久http://www.shnenglu.com/mydriverc/category/4506.html如果想飞得高Q就该把地^U忘?/description>zh-cnMon, 19 May 2008 13:36:51 GMTMon, 19 May 2008 13:36:51 GMT60关于C++cdconst函数http://www.shnenglu.com/mydriverc/articles/35403.html旅?/dc:creator>旅?/author>Sun, 28 Oct 2007 18:52:00 GMThttp://www.shnenglu.com/mydriverc/articles/35403.htmlhttp://www.shnenglu.com/mydriverc/comments/35403.htmlhttp://www.shnenglu.com/mydriverc/articles/35403.html#Feedback0http://www.shnenglu.com/mydriverc/comments/commentRss/35403.htmlhttp://www.shnenglu.com/mydriverc/services/trackbacks/35403.htmlclass A
{
        public :
        char get_m() const
        {
                 return m;
        }
        private:
        char m;
}
请在函数get_m中改变m的倹{?br />
我想Q对于这U流氓问题,只好使用氓的做法:
        char get_m() const
        {
                char * p = (char *) &m;
                *p = 'C';
                 return m;
        }
呵呵Q可以做刎ͼ因ؓcdconst函数是通过“把cd成员都作为const”来实现的?br />不过q是我这U“流氓程序员”的做法?br />
实际上,l过同事的教|应该使用mutable修饰W:
mutable char m;
q样即在类的const函数内,m的类型也是可以改变的了?br />
另外Q如果想不要q䆾工作Q也可以q么写:
#define const
哈哈Q这样面试官׃敢要你啦?D



]]>
const成员函数http://www.shnenglu.com/mydriverc/articles/35401.html旅?/dc:creator>旅?/author>Sun, 28 Oct 2007 18:49:00 GMThttp://www.shnenglu.com/mydriverc/articles/35401.htmlhttp://www.shnenglu.com/mydriverc/comments/35401.htmlhttp://www.shnenglu.com/mydriverc/articles/35401.html#Feedback0http://www.shnenglu.com/mydriverc/comments/commentRss/35401.htmlhttp://www.shnenglu.com/mydriverc/services/trackbacks/35401.html

W五节 const成员函数  

一些成员函数改变对象,一些成员函C改变对象?

例如Q?
int Point::GetY()
{
  return yVal;
}
   q个函数被调用时Q不改变Point对象Q而下面的函数改变Point对象Q?
void Point:: SetPt (int x, int y)
{
  xVal=x;
  yVal=y;
}
   Z使成员函数的意义更加清楚Q我们可在不改变对象的成员函数的函数原型中加上const说明Q?

例题 ?0-15
 

class Point
{
  public:
   int GetX() const;
   int GetY() const;

  void SetPt (int, int);
   void OffsetPt (int, int);
  private:
   int xVal, yVal;
};

   const成员函数应该在函数原型说明和函数定义中都增加const限定Q?
例题?0-16
 

int Point::GetY() const
{
  return yVal;
}

class Set {
public:
  Set (void){ card = 0; }
  bool Member(const int) const;
  void AddElem(const int);
  //...
};

bool Set::Member (const int elem) const
{
  //...
}

  

非常量成员函C能被帔R成员对象调用Q因为它可能企图修改帔R的数据成员:
   const Set s;
   s.AddElem(10); // 非法: AddElem不是帔R成员函数
   s.Member(10); // 正确
   但构造函数和析构函数对这个规则例外,它们从不定义为常量成员,但可被常量对象调用(被自动调用)。它们也能给帔R的数据成员赋|除非数据成员本n是常量?/p>   

 

Z么需要const成员函数Q?
   我们定义的类的成员函CQ常常有一些成员函C改变cȝ数据成员Q也是_q些函数?只读"函数Q而有一些函数要修改cL据成员的倹{如果把不改? 数据成员的函数都加上const关键字进行标识,昄Q可提高E序的可L。其实,它还能提高程序的可靠性,已定义成const的成员函敎ͼ一旦企图修? 数据成员的|则编译器按错误处理?/span>
const成员函数和const对象
   实际上,const成员函数q有另外一作用,卛_量对象相兟뀂对于内|的数据cdQ我们可以定义它们的帔RQ用戯定义的类也一P可以定义它们的常量对象。例如,定义一个整型常量的Ҏ为:
   const int i=1 Q?
同样Q也可以定义帔R对象Q假定有一个类classAQ定义该cȝ帔R对象的方法ؓQ?
   const classA a(2)Q?
   q里Qa是类classA的一个const对象Q?2"传给它的构造函数参数。const对象的数据成员在对象寿命期内不能改变。但是,如何保证该类的数据成员不被改变呢Q?
   Z保const对象的数据成员不会被改变Q在C++中,const对象只能调用const成员函数。如果一个成员函数实际上没有Ҏ据成员作M形式的修改,但是它没有被const关键字限定的Q也不能被常量对象调用。下面通过一个例子来说明q个问题Q?

例题?0-17
 

class C
{
  int X;
public:
  int GetX()
  {
   return X;
  }
  void SetX(int X)
  {
   this->X = X;
  }
};
void main()
{
  const C constC;
  cout<<constC.GetX();
}

  

如果我们~译上面的程序代码,~译器会出现错误提示QconstC是个帔R对象Q它只能调用const成员函数。虽然GetX( )函数实际上ƈ没有改变数据成员XQ由于没有const关键字限定,所以仍旧不能被constC对象调用。如果我们将上述加粗的代码:
   int GetX()
改写成:
   int GetX()const
再重新编译,没有问题了?/span>

   const成员函数的?
   const成员函数表示该成员函数只能读cL据成员,而不能修改类成员数据。定义const成员函数Ӟ把const关键字放在函数的参数表和函数体之 间。有人可能会问:Z么不const攑֜函数声明前呢Q因样做意味着函数的返回值是帔RQ意义完全不同。下面是定义const成员函数的一个实 例:
   class X
   {
    int i;
    public:
    int f() const;
   };
   关键字const必须用同L方式重复出现在函数实现里Q否则编译器会把它看成一个不同的函数Q?
   int X::f() const
   {
    return i;
   }
   如果f( )试图用Q何方式改变i或调用另一个非const成员函数Q编译器给出错误信息。Q何不修改成员数据的函数都应该声明为const函数Q这h助于提高E序的可L和可靠性?/font>


]]>
构造析构顺?/title><link>http://www.shnenglu.com/mydriverc/articles/35400.html</link><dc:creator>旅?/dc:creator><author>旅?/author><pubDate>Sun, 28 Oct 2007 18:41:00 GMT</pubDate><guid>http://www.shnenglu.com/mydriverc/articles/35400.html</guid><wfw:comment>http://www.shnenglu.com/mydriverc/comments/35400.html</wfw:comment><comments>http://www.shnenglu.com/mydriverc/articles/35400.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/mydriverc/comments/commentRss/35400.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mydriverc/services/trackbacks/35400.html</trackback:ping><description><![CDATA[#include <iostream.h><br />//using namespace std;<br />class A{<br />public:<br />    int i;<br />    A(int m)<br />    {<br />        i=m;<br />    cout<<i<<" A con"<<endl;<br />    }<br />    ~A()<br />    {<br />    cout<<i<<"  A des"<<endl;<br />    }<br />};<br />A a(0);<br />int main()<br />{<br />    cout<<"main"<<endl;<br />A b(1);<br />static A c(2);<br />cout<<"unmain"<<endl;<br />}<br />0 A con<br />main<br />1 A con<br />2 A con<br />unmain<br />1 A des<br />2 A des<br />0 A des<br /><br /><br />#include <iostream.h><br />//using namespace std;<br />class A{<br />public:<br />    int i;<br />    A(int m)<br />    {<br />        i=m;<br />    cout<<i<<" A con"<<endl;<br />    }<br />    ~A()<br />    {<br />    cout<<i<<"  A des"<<endl;<br />    }<br />};<br />A a(0);<br />int main()<br />{<br />    cout<<"main"<<endl;<br />A b(1);<br />A c(2);<br />cout<<"unmain"<<endl;<br />}<br /><br />0 A con<br />main<br />1 A con<br />2 A con<br />3 A con<br />unmain<br />2 A des<br />1 A des<br />3 A des<br />0 A des<br /><br /><img src ="http://www.shnenglu.com/mydriverc/aggbug/35400.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mydriverc/" target="_blank">旅?/a> 2007-10-29 02:41 <a href="http://www.shnenglu.com/mydriverc/articles/35400.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++构造函C析构函数执行序 Q?Q?/title><link>http://www.shnenglu.com/mydriverc/articles/35398.html</link><dc:creator>旅?/dc:creator><author>旅?/author><pubDate>Sun, 28 Oct 2007 18:31:00 GMT</pubDate><guid>http://www.shnenglu.com/mydriverc/articles/35398.html</guid><wfw:comment>http://www.shnenglu.com/mydriverc/comments/35398.html</wfw:comment><comments>http://www.shnenglu.com/mydriverc/articles/35398.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/mydriverc/comments/commentRss/35398.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mydriverc/services/trackbacks/35398.html</trackback:ping><description><![CDATA[ <div> <span style="font-size: 14pt;"> 今天在测试一个构造函数和析构函数的用例的时候,发现我们所钟爱的VC6.0实在是Bug问题来多Q对于学习C++的新手来Ԍ有必要在q里l大家说明一下?/span> </div> <span style="font-size: 14pt;"> <p>构造函数顺序ؓQ?/p> <ol> <li> <span style="font-size: 10pt;"> 全局对象的构造函敎ͼ </span> </li> <li> <span style="font-size: 10pt;"> main函数中对象的构造函敎ͼ包括automatic、static依次调用Q?</span> </li> <li> <span style="font-size: 10pt;"> main中遇到函C有局部对象时Q进入到函数中调用局部对象的构造函数?/span> </li> </ol> <p> <span style="font-size: 10pt;">     注:static对象的构造函数永q只调用一ơ?/span> </p> <p>析构函数序为:</p> <ol> <li> <span style="font-size: 10pt;">退出函数时Q执行函数内构造的automatic对象的析构函敎ͼ注:static对象不析构; </span> </li> <li> <span style="font-size: 10pt;">main函数中按构造的逆序析构automatic对象Q?</span> </li> <li> <span style="font-size: 10pt;">调用函数中定义的static对象的析构函敎ͼ </span> </li> <li> <span style="font-size: 10pt;">调用main中定义的static对象的析构函敎ͼ </span> </li> <li> <span style="font-size: 10pt;">最后调用全局对象的析构函数?/span> </li> </ol> <p> <span style="font-size: 10pt;">注:复合中的构造、析构顺?/span> </p> <p> <span style="font-size: 10pt;">     构造:按声明对象的序来构造成员对象,而不是按照构造函数成员初始值列表中列出的顺序;而且在包含它们的cd?宿主对象)被构造之前构造。即Q由内向外构造?/span> </p> <p> <span style="font-size: 10pt;">    析构Q按对象构造的逆序析构。对于复合对象,先析构主对象Q再析构其包含的对象?/span> </p> <div> <span style="font-size: 14pt;">比如有以下的试用例Q?/span> </div> <blockquote dir="ltr" style="margin-right: 0px;"> <blockquote dir="ltr" style="margin-right: 0px;"> <div> <span style="font-size: 10pt;">//Qi nclude <iostream.h><br />Qi nclude <iostream><br />using namespace std;<br />class Demo {<br /> int id;<br />public: <br /> Demo(int i)  <br /> { id = i; <br /> cout << "id=" << id << ",Con" << endl; }<br /> ~Demo()<br /> { cout << "id=" << id << ",Des" <<endl; }<br />};</span> </div> <div> <span style="font-size: 10pt;">Demo d1(4);</span> </div> <div> <span style="font-size: 10pt;">void fun(Demo d) {<br /> static Demo d2(2);<br /> Demo d3(3);<br /> cout << "fun" << endl;  <br />}<br />void main ()  {<br /> cout <<"main"<< endl;<br /> fun(d1);<br /> cout << "endmain" << endl;<br /> fun(d1); <br /> Demo * p = new Demo(8);<br /> <br />}</span> </div> <br /> </blockquote> </blockquote> <div dir="ltr">E序执行的时候,在VC6 withSp6下运行的l果</div> <blockquote dir="ltr" style="margin-right: 0px;"> <blockquote dir="ltr" style="margin-right: 0px;"> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"> <span style="font-size: 12pt; font-family: Times New Roman;" lang="EN-US">id=4,Con</span> </p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"> <span style="font-size: 12pt; font-family: Times New Roman;" lang="EN-US">main</span> </p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"> <span style="font-size: 12pt; font-family: Times New Roman;" lang="EN-US">id=2,Con</span> </p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"> <span style="font-size: 12pt; font-family: Times New Roman;" lang="EN-US">id=3,Con</span> </p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"> <span style="font-size: 12pt; font-family: Times New Roman;" lang="EN-US">fun</span> </p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"> <span style="font-size: 12pt; font-family: Times New Roman;" lang="EN-US">id=3,Des</span> </p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"> <span style="font-size: 12pt; font-family: Times New Roman;" lang="EN-US">id=4,Des</span> </p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"> <span style="font-size: 12pt; font-family: Times New Roman;" lang="EN-US">endmain</span> </p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"> <span style="font-size: 12pt; font-family: Times New Roman;" lang="EN-US">id=3,Con</span> </p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"> <span style="font-size: 12pt; font-family: Times New Roman;" lang="EN-US">fun</span> </p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"> <span style="font-size: 12pt; font-family: Times New Roman;" lang="EN-US">id=3,Des</span> </p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"> <span style="font-size: 12pt; font-family: Times New Roman;" lang="EN-US">id=4,Des</span> </p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"> <span style="font-size: 12pt; font-family: Times New Roman;" lang="EN-US">id=8,Con</span> </p> <div id="ww2eoeu" class="MsoNormal" style="margin: 0cm 0cm 0pt;"> <span style="font-size: 12pt; font-family: Times New Roman;" lang="EN-US">id=2,Des</span> </div> <div id="ss4mww2" class="MsoNormal" style="margin: 0cm 0cm 0pt;"> <span style="font-size: 12pt; font-family: Times New Roman;" lang="EN-US"> </span> <span style="font-size: 12pt; font-family: Times New Roman;" lang="EN-US">//id=4,Des //在用<iostream.h>的时候才有此句输?/span> </div> </blockquote> </blockquote> <div id="4o2q44a" class="MsoNormal" dir="ltr" style="margin: 0cm 0cm 0pt;"> <span style="font-size: 12pt; font-family: Times New Roman;" lang="EN-US">        其中包含有注释的部分Qؓ调整包含的头文g?lt;iostream.h>的情况下才有的输出。如果?命名I间的std的话Q没有最后的一句输出?/span> </div> <div id="ioec2c4" class="MsoNormal" dir="ltr" style="margin: 0cm 0cm 0pt;"> <span style="font-size: 12pt; font-family: Times New Roman;" lang="EN-US">        从百度上找了半天Q才发现不是没有调用全局变量的析构函敎ͼ而是因ؓ我们所用的~译器有问题Q这是MS的品对于C++的支持做的不是尽善尽,有网友说在Vc7.0中好x除了q个Bug?/span> </div> </span> <img src ="http://www.shnenglu.com/mydriverc/aggbug/35398.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mydriverc/" target="_blank">旅?/a> 2007-10-29 02:31 <a href="http://www.shnenglu.com/mydriverc/articles/35398.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>头文? externhttp://www.shnenglu.com/mydriverc/articles/35396.html旅?/dc:creator>旅?/author>Sun, 28 Oct 2007 18:02:00 GMThttp://www.shnenglu.com/mydriverc/articles/35396.htmlhttp://www.shnenglu.com/mydriverc/comments/35396.htmlhttp://www.shnenglu.com/mydriverc/articles/35396.html#Feedback0http://www.shnenglu.com/mydriverc/comments/commentRss/35396.htmlhttp://www.shnenglu.com/mydriverc/services/trackbacks/35396.html  试题4Qؓ什么标准头文g都有cM以下的结构?

#ifndef __INCvxWorksh
#define __INCvxWorksh
#ifdef __cplusplus

extern "C" {
#endif
/*...*/
#ifdef __cplusplus
}

#endif
#endif /* __INCvxWorksh */

  解答Q?br />
  头文件中的编译宏

#ifndef __INCvxWorksh
#define __INCvxWorksh
#endif

  的作用是防止被重复引用?br />
  作ؓ一U面向对象的语言QC++支持函数重蝲Q而过E式语言C则不支持。函数被C++~译后在symbol库中的名字与C语言的不同。例如,假设某个函数的原型ؓQ?

void foo(int x, int y);


  该函数被C~译器编译后在symbol库中的名字ؓ_fooQ而C++~译器则会生像_foo_int_int之类的名字。_foo_int_intq样的名字包含了函数名和函数参数数量及类型信息,C++是考这U机制来实现函数重蝲的?br />
  Z实现C和C++的؜合编E,C++提供了Cq接交换指定W号extern "C"来解军_字匹配问题,函数声明前加上extern "C"后,则编译器׃按照C语言的方式将该函数编译ؓ_fooQ这样C语言中就可以调用C++的函C?/p>

]]>
BOOL和bool的区?/title><link>http://www.shnenglu.com/mydriverc/articles/35395.html</link><dc:creator>旅?/dc:creator><author>旅?/author><pubDate>Sun, 28 Oct 2007 17:46:00 GMT</pubDate><guid>http://www.shnenglu.com/mydriverc/articles/35395.html</guid><wfw:comment>http://www.shnenglu.com/mydriverc/comments/35395.html</wfw:comment><comments>http://www.shnenglu.com/mydriverc/articles/35395.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/mydriverc/comments/commentRss/35395.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mydriverc/services/trackbacks/35395.html</trackback:ping><description><![CDATA[一Q在|上扑ֈ了BOOL和bool的区别:<br />1、类型不?br />BOOL为int?br />bool为布型<br />2、长度不?br />bool只有一个字?br />BOOL长度视实际环境来定,一般可认ؓ?个字?br />3、取g?br />bool取值false和trueQ是0?的区?br />BOOL取值FALSE和TRUEQ是0和非0的区?br />二:<br />bool是标准C++数据cdQ可取值true和false。单独占一个字节,<br />如果Cbool对象列在一P可能会各占一个bitQ这取决于编译器?br /><br />BOOL是微软定义的typedef int BOOL。与bool不同Q它是一个三值逻辑<br /><br />Q?br />TRUE/FALSE/ERRORQ返回gؓ>0的整CؓTRUEQ?为FALSEQ?1为ERROR?br />Win32 API中很多返回gؓBOOL的函数都是三值逻辑。比如GetMessage<br /><br />().<br />三:<br />大BOOL和小bool之间的区别:<br />1、类型不?br />BOOL为int?br />bool为布型<br />2、长度不?br />bool只有一个字?br />BOOL长度视实际环境来定,一般可认ؓ?个字?br />3、取g?br />bool取值false和trueQ是0?的区?br />BOOL取值FALSE和TRUEQ是0和非0的区?br />4、例?br />bool x=3;  //告警<br />bool x=1;  //正确<br />BOOL x=3;  //正确<br />BOOL x=3.3;  //告警<br />注:windowsZ兼容问题定义的基变量?br />typedef unsigned long       DWORD;<br />typedef int                 BOOL;<br />typedef unsigned char       BYTE;<br />typedef unsigned short      WORD;<br />typedef float               FLOAT;<br />typedef FLOAT               *PFLOAT;<br />typedef BOOL near           *PBOOL;<br />typedef BOOL far            *LPBOOL;<br />typedef BYTE near           *PBYTE;<br />typedef BYTE far            *LPBYTE;<br />typedef int near            *PINT;<br />typedef int far             *LPINT;  //   maximum   heap   size <br /><br /> <br />  );  <br /><br /><img src ="http://www.shnenglu.com/mydriverc/aggbug/35395.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mydriverc/" target="_blank">旅?/a> 2007-10-29 01:46 <a href="http://www.shnenglu.com/mydriverc/articles/35395.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>++ Q?Q?Q?http://www.shnenglu.com/mydriverc/articles/35394.html旅?/dc:creator>旅?/author>Sun, 28 Oct 2007 17:42:00 GMThttp://www.shnenglu.com/mydriverc/articles/35394.htmlhttp://www.shnenglu.com/mydriverc/comments/35394.htmlhttp://www.shnenglu.com/mydriverc/articles/35394.html#Feedback0http://www.shnenglu.com/mydriverc/comments/commentRss/35394.htmlhttp://www.shnenglu.com/mydriverc/services/trackbacks/35394.html{
    int i=0;
    printf("%d,%d,%d",(++i),(++i),(++i));
}
3 2 1

int main()
{
    int i=0;
    printf("%d,%d,%d",(i++),(i++),(i++));
}
0 0 0


]]>
Strcpy与memcpy两函数的l典实现http://www.shnenglu.com/mydriverc/articles/35393.html旅?/dc:creator>旅?/author>Sun, 28 Oct 2007 17:23:00 GMThttp://www.shnenglu.com/mydriverc/articles/35393.htmlhttp://www.shnenglu.com/mydriverc/comments/35393.htmlhttp://www.shnenglu.com/mydriverc/articles/35393.html#Feedback0http://www.shnenglu.com/mydriverc/comments/commentRss/35393.htmlhttp://www.shnenglu.com/mydriverc/services/trackbacks/35393.html       assert((des != NULL) && (src != NULL));
       char *add = des;
       while ((*des++ = *src++) != ‘\0? ;
return des;
}
 
void  *memcpy(void *pvTo, const void *pvFrom, size_t size) {
       assert((pvTo != NULL) && (pvFrom != NULL));      // 使用断言
       byte *pbTo = (byte *) pvTo;         // 防止改变pvTo的地址
       byte *pbFrom = (byte *) pvFrom; // 防止改变pvFrom的地址
       while(size -- > 0 
              *pbTo ++ = *pbFrom ++ ;
       return pvTo;
}

]]>
sizeofhttp://www.shnenglu.com/mydriverc/articles/35391.html旅?/dc:creator>旅?/author>Sun, 28 Oct 2007 17:12:00 GMThttp://www.shnenglu.com/mydriverc/articles/35391.htmlhttp://www.shnenglu.com/mydriverc/comments/35391.htmlhttp://www.shnenglu.com/mydriverc/articles/35391.html#Feedback0http://www.shnenglu.com/mydriverc/comments/commentRss/35391.htmlhttp://www.shnenglu.com/mydriverc/services/trackbacks/35391.html
void Func ( char str[100] )
{
 sizeof( str ) = ?
}

void *p = malloc( 100 );
sizeof ( p ) = ?

  解答Q?br />
sizeof( str ) = 4
sizeof ( p ) = 4

  剖析Q?br />
  Func ( char str[100] )函数中数l名作ؓ函数形参Ӟ在函C内,数组名失M本n的内涵,仅仅只是一个指针;在失d内涵的同Ӟ它还失去了其帔RҎ,可以作自增、自减等操作Q可以被修改?br />
  数组名的本质如下Q?br />
  Q?Q数l名指代一U数据结构,q种数据l构是数组Q?br />
  例如Q?br />
char str[10];
cout << sizeof(str) << endl;

  输出l果?0Qstr指代数据l构char[10]?br />
  Q?Q数l名可以转换为指向其指代实体的指针,而且是一个指针常量,不能作自增、自减等操作Q不能被修改Q?br />
char str[10];
str++; //~译出错Q提Cstr不是左倹{

  Q?Q数l名作ؓ函数形参Ӟ沦ؓ普通指针?br />
  Windows NT 32位^CQ指针的长度Q占用内存的大小Qؓ4字节Q故sizeof( str ) 、sizeof ( p ) 都ؓ4?br />

]]>
分别l出BOOLQintQfloatQ指针变?与“零值”比较的 if 语句http://www.shnenglu.com/mydriverc/articles/35390.html旅?/dc:creator>旅?/author>Sun, 28 Oct 2007 17:08:00 GMThttp://www.shnenglu.com/mydriverc/articles/35390.htmlhttp://www.shnenglu.com/mydriverc/comments/35390.htmlhttp://www.shnenglu.com/mydriverc/articles/35390.html#Feedback0http://www.shnenglu.com/mydriverc/comments/commentRss/35390.htmlhttp://www.shnenglu.com/mydriverc/services/trackbacks/35390.html
  解答Q?br />
   BOOL型变量:if(!var)

   int型变量: if(var==0)

   float型变量:

   const float EPSINON = 0.00001;

   if ((x >= - EPSINON) && (x <= EPSINON)

   指针变量Q  if(var==NULL)

  剖析Q?br />
  考查?值判断的“内功”,BOOL型变量的0判断完全可以写成if(var==0)Q而int型变量也可以写成if(!var)Q指针变量的判断也可以写成if(!var)Q上q写法虽然程序都能正运行,但是未能清晰地表辄序的意思?table align="left" border="0" cellpadding="0" cellspacing="0">
 
 

   一般的Q如果想让if判断一个变量的“真”、“假”,应直接用if(var)、if(!var)Q表明其为“逻辑”判断;如果用if判断一个数值型? ?short、int、long{?Q应该用if(var==0)Q表明是?q行“数值”上的比较;而判断指针则适宜用if(var==NULL)Q? q是一U很好的~程习惯?br />
  点型变量ƈ不精,所以不可将float变量用?=”或“!=”与数字比较Q应该设法{化成?gt;=”或?lt;=”Ş式。如果写成if (x == 0.0)Q则判ؓ错,?分?img src ="http://www.shnenglu.com/mydriverc/aggbug/35390.html" width = "1" height = "1" />

]]>
GetMemory 攚whttp://www.shnenglu.com/mydriverc/articles/35389.html旅?/dc:creator>旅?/author>Sun, 28 Oct 2007 17:03:00 GMThttp://www.shnenglu.com/mydriverc/articles/35389.htmlhttp://www.shnenglu.com/mydriverc/comments/35389.htmlhttp://www.shnenglu.com/mydriverc/articles/35389.html#Feedback0http://www.shnenglu.com/mydriverc/comments/commentRss/35389.htmlhttp://www.shnenglu.com/mydriverc/services/trackbacks/35389.html
void GetMemory( char *p )
{
 p = (char *) malloc( 100 );
}

void Test( void )
{
 char *str = NULL;
 GetMemory( str );
 strcpy( str, "hello world" );
 printf( str );
}

  试题5Q?br />
char *GetMemory( void )
{
 char p[] = "hello world";
 return p;
}

void Test( void )
{
 char *str = NULL;
 str = GetMemory();
 printf( str );
}

  试题6Q?br />
void GetMemory( char **p, int num )
{
 *p = (char *) malloc( num );
}

void Test( void )
{
 char *str = NULL;
 GetMemory( &str, 100 );
 strcpy( str, "hello" );
 printf( str );
}

  试题7Q?br />
void Test( void )
{
 char *str = (char *) malloc( 100 );
 strcpy( str, "hello" );
 free( str );
 ... //省略的其它语?br />}

  解答Q?br />
  试题4传入中GetMemory( char *p )函数的Ş参ؓ字符串指针,在函数内部修改Ş参ƈ不能真正的改变传入Ş参的|执行?br />
char *str = NULL;
GetMemory( str );

  后的str仍然为NULLQ?br />
  试题5?br />
char p[] = "hello world";
return p;

  的p[]数组为函数内的局部自动变量,在函数返回后Q内存已l被释放。这是许多程序员常犯的错误,其根源在于不理解变量的生存期?br />
  试题6的GetMemory避免了试?的问题,传入GetMemory的参Cؓ字符串指针的指针Q但是在GetMemory中执行申请内存及赋D?br />
*p = (char *) malloc( num );

  后未判断内存是否甌成功Q应加上Q?br />
if ( *p == NULL )
{
 ...//q行甌内存p|处理
}

  试题7存在与试?同样的问题,在执?br />
char *str = (char *) malloc(100);

  后未q行内存是否甌成功的判断;另外Q在free(str)后未|str为空Q导致可能变成一个“野”指针,应加上:

str = NULL;

  试题6的Test函数中也未对malloc的内存进行释放?br />
  剖析Q?br />
  试题4?考查面试者对内存操作的理解程度,基本功扎实的面试者一般都能正的回答其中50~60的错误。但是要完全解答正确Q却也绝非易事?br />
  对内存操作的考查主要集中在:

  Q?Q指针的理解Q?br />
  Q?Q变量的生存期及作用范围Q?br />
  Q?Q良好的动态内存申请和释放习惯?br />
  再看看下面的一D늨序有什么错误:

swap( int* p1,int* p2 )
{
 int *p;
 *p = *p1;
 *p1 = *p2;
 *p2 = *p;
}

  在swap函数中,p是一个“野”指针,有可能指向系l区Q导致程序运行的崩溃。在VC++中DEBUGq行时提C错误“Access Violation”。该E序应该改ؓQ?br />
swap( int* p1,int* p2 )
{
 int p;
 p = *p1;
 *p1 = *p2;
 *p2 = p;
}


]]>
strcpyhttp://www.shnenglu.com/mydriverc/articles/35388.html旅?/dc:creator>旅?/author>Sun, 28 Oct 2007 16:56:00 GMThttp://www.shnenglu.com/mydriverc/articles/35388.htmlhttp://www.shnenglu.com/mydriverc/comments/35388.htmlhttp://www.shnenglu.com/mydriverc/articles/35388.html#Feedback0http://www.shnenglu.com/mydriverc/comments/commentRss/35388.htmlhttp://www.shnenglu.com/mydriverc/services/trackbacks/35388.html
void test1()
{
 char string[10];
 char* str1 = "0123456789";
 strcpy( string, str1 );
}

  试题2Q?br />
void test2()
{
 char string[10], str1[10];
 int i;
 for(i=0; i<10; i++)
 {
  str1[i] = 'a';
 }
 strcpy( string, str1 );
}

  试题3Q?br />
void test3(char* str1)
{
 char string[10];
 if( strlen( str1 ) <= 10 )
 {
  strcpy( string, str1 );
 }
}

  解答Q?br />
  试题1字符串str1需?1个字节才能存放下Q包括末’\0’)Q而string只有10个字节的I间Qstrcpy会导致数l越界;

   对试?Q如果面试者指出字W数lstr1不能在数l内l束可以l?分;如果面试者指出strcpy(string, str1)调用使得从str1内存起复制到string内存h复制的字节数h不确定性可以给7分,在此基础上指出库函数strcpy工作方式的给10 分;

  对试?Qif(strlen(str1) <= 10)应改为if(strlen(str1) < 10)Q因为strlen的结果未l计’\0’所占用?个字节?br />
  剖析Q?br />
  考查对基本功的掌握:

  (1)字符串以’\0’结;

  (2)Ҏl越界把握的敏感度;

  (3)库函数strcpy的工作方式,如果~写一个标准strcpy函数的dgؓ10Q下面给出几个不同得分的{案Q?br />
  2?br />
void strcpy( char *strDest, char *strSrc )
{
  while( (*strDest++ = * strSrc++) != ‘\0?);
}

  4?br />
void strcpy( char *strDest, const char *strSrc )
//源字符串加constQ表明其入参敎ͼ??br />{
  while( (*strDest++ = * strSrc++) != ‘\0?);
}

  7?br />
void strcpy(char *strDest, const char *strSrc)
{
 //Ҏ地址和目的地址加非0断言Q加3?br /> assert( (strDest != NULL) && (strSrc != NULL) );
 while( (*strDest++ = * strSrc++) != ‘\0?);
}

  10?br />
//Z实现铑ּ操作Q将目的地址q回Q加3分!

char * strcpy( char *strDest, const char *strSrc )
{
 assert( (strDest != NULL) && (strSrc != NULL) );
 char *address = strDest;
 while( (*strDest++ = * strSrc++) != ‘\0?);
  return address;
}

  ?分到10分的几个{案我们可以清楚的看刎ͼ小的strcpy竟然暗藏着q么多玄机,真不是盖的!需要多么扎实的基本功才能写一个完的strcpy啊!
(4)对strlen的掌握,它没有包括字W串末尾?\0'?br />
 读者看了不同分值的strcpy版本Q应该也可以写出一?0分的strlen函数了,完美的版本ؓQ?int strlen( const char *str ) //输入参数const

{
 assert( strt != NULL ); //断言字符串地址?
 int len;
 while( (*str++) != '\0' )
 {
  len++;
 }
 return len;
}



]]>
new ?mallochttp://www.shnenglu.com/mydriverc/articles/35387.html旅?/dc:creator>旅?/author>Sun, 28 Oct 2007 16:50:00 GMThttp://www.shnenglu.com/mydriverc/articles/35387.htmlhttp://www.shnenglu.com/mydriverc/comments/35387.htmlhttp://www.shnenglu.com/mydriverc/articles/35387.html#Feedback0http://www.shnenglu.com/mydriverc/comments/commentRss/35387.htmlhttp://www.shnenglu.com/mydriverc/services/trackbacks/35387.html
malloc与free是C++/C语言的标准库函数Qnew/delete是C++的运符。它们都可用于申请动态内存和释放内存? 
  对于非内部数据类型的对象而言Q光用maloc/free无法满动态对象的要求。对象在创徏的同时要自动执行构造函敎ͼ对象在消亡之前要自动执行析构? 数。由于malloc/free是库函数而不是运符Q不在编译器控制权限之内Q不能够把执行构造函数和析构函数的Q务强加于malloc/free?  
  因此C++语言需要一个能完成动态内存分配和初始化工作的q算WnewQ以及一个能完成清理与释攑ֆ存工作的q算Wdelete。注意new/delete不是库函数? 
  我们先看一看malloc/free和new/delete如何实现对象的动态内存管理? 
   
  class   Obj  
  {  
  public   :  
  Obj(void){   cout   <<   “Initialization?  <<   endl;   }  
  ~Obj(void){   cout   <<   “Destroy?  <<   endl;   }  
  void Initialize(void){   cout   <<   “Initialization?  <<   endl;   }  
  void         Destroy(void){   cout   <<   “Destroy?  <<   endl;   }  
  };  
  void   UseMallocFree(void)  
  {  
  Obj     *a   =   (obj   *)malloc(sizeof(obj)); //   甌动态内? 
  a->Initialize(); //   初始? 
  //? 
  a->Destroy(); //   清除工作  
  free(a); //   释放内存  
  }  
  void   UseNewDelete(void)  
  {  
  Obj     *a   =   new   Obj; //   甌动态内存ƈ且初始化  
  //? 
  delete   a; //   清除q且释放内存  
  }  
    用malloc/free和new/delete如何实现对象的动态内存管? 
   
  cObj的函数Initialize模拟了构造函数的功能Q函数Destroy模拟了析构函数的功能。函数UseMallocFree中,׃ malloc/free不能执行构造函C析构函数Q必调用成员函数Initialize和Destroy来完成初始化与清除工作。函? UseNewDelete则简单得多? 
  所以我们不要企囄malloc/free来完成动态对象的内存理Q应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过E,对它们而言malloc/free和new/delete是等L? 
  既然new/delete的功能完全覆盖了malloc/freeQؓ什么C++不把malloc/free淘汰出局呢?q是因ؓC++E序l常要调用C函数Q而CE序只能用malloc/free理动态内存? 
  如果用free释放“new创徏的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc甌的动态内 存”,理论上讲E序不会出错Q但是该E序的可L很差。所以new/delete必须配对使用Qmalloc/free也一栗 ?
函数malloc的原型如下:  
  void   *   malloc(size_t   size);  
  用malloc甌一块长度ؓlength的整数类型的内存Q程序如下:  
  int     *p   =   (int   *)   malloc(sizeof(int)   *   length);  
  我们应当把注意力集中在两个要素上Q“类型{换”和“sizeof”? 
  mallocq回值的cd是void   *Q所以在调用malloc时要昑ּ地进行类型{换,void   *   转换成所需要的指针cd。malloc函数本nq不识别要申L内存是什么类型,它只兛_内存的d节数。我们通常C住int,   float{数据类型的变量的确切字节数? 
   
  q算Wnew使用h要比函数malloc单得多,例如Q? 
  int     *p1   =   (int   *)malloc(sizeof(int)   *   length);  
  int     *p2   =   new   int[length];  
  q是因ؓnew内置了sizeof、类型{换和cd安全查功能。对于非内部数据cd的对象而言Qnew在创建动态对象的同时完成了初始化工作。如果对象有多个构造函敎ͼ那么new的语句也可以有多UŞ式。例? 
  class   Obj  
  {  
  public   :  
  Obj(void); //   无参数的构造函? 
  Obj(int   x); //   带一个参数的构造函? 
  ? 
  }  
  void   Test(void)  
  {  
  Obj     *a   =   new   Obj;  
  Obj     *b   =   new   Obj(1); //   初gؓ1  
  ? 
  delete   a;  
  delete   b;  
  }  
  如果用new创徏对象数组Q那么只能用对象的无参数构造函数?/div>
 
区别两个  
   
  1   new是操作符  
      malloc是库函数  
   
  2   new可以调用构造函敎ͼmalloc不可? 
   
   
  q有Q这两个函数不存在内存分配大问? 
  q两个操作是在堆里面甌内存I间Q除非空间不够了Q返回BULL指针Q否则都没有问题的,如果你出C某种情况Q看看是不是其它的问题。 ?
new   最l调用的是HeapAlloc,而HeapAlloc声明如下Q? 
  LPVOID   HeapAlloc(  
      HANDLE   hHeap,     //   handle   to   the   private   heap   block  
      DWORD   dwFlags,   //   heap   allocation   control   flags  
      DWORD   dwBytes     //   number   of   bytes   to   allocate  
  );  
  其中W一个参数必LHeapCreate或GetProcessHeap   函数的返回句柄? 
  如果是HeapCreate的话Q如下:Q? 
  HANDLE   HeapCreate(  
      DWORD   flOptions,             //   heap   allocation   flag  
      DWORD   dwInitialSize,     //   initial   heap   size  
      DWORD   dwMaximumSize       //   maximum   heap   size  
  );  
  那么当该函数的最后一个参数非0Ӟ所创徏的堆要比0x7FFF8(512k)略小。如果ؓ0Q则大小受到可用内存的限制? 
  q有Qnew甌的内存不可移动,会造成内存片?/div>
 
 
内存分配最l都?HEAP)上操?允许的最大空间是_HEAP_MAXREQ=0xFFFFFFE0,但Cq行库会在每ơ额外分配一? _CrtMemBlockHeaderl构在该ơ分配的内存起始?同时在结束处多分配nNoMansLadnSize=4个字节的内存用于检查调 ?因此通常的高效内存管理技术都是将多次空间分配合q成一ơ大I间分配,或只q行一ơ分?回收时不释放以直接用于下ơ分配的   .  
  可分配空间ƈ不等于一定可以分配到,q受环境的直接媄?如页文g的大?pȝ已经占用的空间等.  
  当所l参数太?会有q行时警?Invalid   allocation   size:   %u   bytes.


]]>cM的常?/title><link>http://www.shnenglu.com/mydriverc/articles/35286.html</link><dc:creator>旅?/dc:creator><author>旅?/author><pubDate>Fri, 26 Oct 2007 17:04:00 GMT</pubDate><guid>http://www.shnenglu.com/mydriverc/articles/35286.html</guid><wfw:comment>http://www.shnenglu.com/mydriverc/comments/35286.html</wfw:comment><comments>http://www.shnenglu.com/mydriverc/articles/35286.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/mydriverc/comments/commentRss/35286.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mydriverc/services/trackbacks/35286.html</trackback:ping><description><![CDATA[cM的常?br /> 有时我们希望某些帔R只在cM有效。由?define 定义的宏帔R是全局的,不能<br /> 辑ֈ目的Q于是想当然地觉得应该用const 修饰数据成员来实现。const 数据成员的确<br /> 是存在的Q但其含义却不是我们所期望的。const 数据成员只在某个对象生存期内是常<br /> 量,而对于整个类而言却是可变的,因ؓcd以创建多个对象,不同的对象其const ?br /> 据成员的值可以不同?br /> 不能在类声明中初始化const 数据成员。以下用法是错误的,因ؓcȝ对象未被?br /> 建时Q编译器不知道SIZE 的值是什么?br /> class A<br /> {?br /> const int SIZE = 100; // 错误Q企囑֜cd明中初始化const 数据成员<br /> int array[SIZE]; // 错误Q未知的SIZE<br /> };<br /> const 数据成员的初始化只能在类构造函数的初始化表中进行,例如<br /> class A<br /> {?br /> A(int size); // 构造函?br /> const int SIZE ;<br /> };<br /> A::A(int size) : SIZE(size) // 构造函数的初始化表<br /> {<br /> ?br /> }<br /> A a(100); // 对象 a 的SIZE gؓ100<br /> A b(200); // 对象 b 的SIZE gؓ200<br /> 怎样才能建立在整个类中都恒定的常量呢Q别指望const 数据成员了,应该用类?br /> 的枚丑ָ量来实现。例?br /> class A<br /> {?br /> enum { SIZE1 = 100, SIZE2 = 200}; // 枚D帔R<br /> int array1[SIZE1];<br /> int array2[SIZE2];<br /> };<br /> 枚D帔R不会占用对象的存储空_它们在编译时被全部求倹{枚丑ָ量的~点是:<br /> 它的隐含数据cd是整敎ͼ其最大值有限,且不能表CQҎQ如PI=3.14159Q?br /><img src ="http://www.shnenglu.com/mydriverc/aggbug/35286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mydriverc/" target="_blank">旅?/a> 2007-10-27 01:04 <a href="http://www.shnenglu.com/mydriverc/articles/35286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是堆内存分配栈内存分配http://www.shnenglu.com/mydriverc/articles/35284.html旅?/dc:creator>旅?/author>Fri, 26 Oct 2007 16:42:00 GMThttp://www.shnenglu.com/mydriverc/articles/35284.htmlhttp://www.shnenglu.com/mydriverc/comments/35284.htmlhttp://www.shnenglu.com/mydriverc/articles/35284.html#Feedback0http://www.shnenglu.com/mydriverc/comments/commentRss/35284.htmlhttp://www.shnenglu.com/mydriverc/services/trackbacks/35284.html 在C++中,内存分成5个区Q他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区?
栈,是那些q译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等?
堆,是那些由new分配的内存块Q他们的释放~译器不ȝQ由我们的应用程序去控制Q一般一个newp对应一个delete。如果程序员没有释放掉,那么在程序结束后Q操作系l会自动回收?
自由存储区,是那些由malloc{分配的内存块,他和堆是十分怼的,不过它是用free来结束自q生命的?
全局/静态存储区Q全局变量和静态变量被分配到同一块内存中Q在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有q个区分了,他们共同占用同一块内存区?
帔R存储区,q是一块比较特D的存储区,他们里面存放的是帔RQ不允许修改Q当Ӟ你要通过非正当手D也可以修改Q而且Ҏ很多Q在《const的思考》一文中Q我l出?U方法)

明确区分堆与?
在bbs上,堆与栈的区分问题Q似乎是一个永恒的话题Q由此可见,初学者对此往往是؜淆不清的Q所以我军_拿他W一个开刀?
首先Q我们D一个例子:
void f() { int* p=new int[5]; }
q条短短的一句话包含了堆与栈,看到newQ我们首先就应该惛_Q我们分配了一块堆内存Q那么指针p呢?他分配的是一块栈内存Q所以这句话的意思就是: 在栈内存中存放了一个指向一块堆内存的指针p。在E序会先定在堆中分配内存的大小Q然后调用operator new分配内存Q然后返回这块内存的首地址Q放入栈中,他在VC6下的汇编代码如下Q?
00401028 push 14h
0040102A call operator new (00401060)
0040102F add esp,4
00401032 mov dword ptr [ebp-8],eax
00401035 mov eax,dword ptr [ebp-8]
00401038 mov dword ptr [ebp-4],eax
q里Q我们ؓ了简单ƈ没有释放内存Q那么该怎么去释攑֑Q是delete p么?澻I错了Q应该是delete []pQ这是ؓ了告诉编译器Q我删除的是一个数l,VC6׃Ҏ相应的Cookie信息去进行释攑ֆ存的工作?
好了Q我们回到我们的主题Q堆和栈I竟有什么区别?
主要的区别由以下几点Q?
1、管理方式不同;
2、空间大不同;
3、能否生碎片不同;
4、生长方向不同;
5、分配方式不同;
6、分配效率不同;
理方式Q对于栈来讲Q是q译器自动理Q无需我们手工控制Q对于堆来说Q释攑ַ作由E序员控ӞҎ产生memory leak?
I间大小Q一般来讲在32位系l下Q堆内存可以辑ֈ4G的空_从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲Q一般都是有一定的I间大小的,例如Q在VC6下面Q默认的栈空间大是1MQ好像是Q记不清楚了Q。当Ӟ我们可以修改Q?
打开工程Q依ơ操作菜单如下:Project->Setting->LinkQ在Category 中选中OutputQ然后在Reserve中设定堆栈的最大值和commit?
注意Qreserve最gؓ4ByteQcommit是保留在虚拟内存的页文g里面Q它讄的较大会使栈开辟较大的|可能增加内存的开销和启动时间?
片问题Q对于堆来讲Q频J的new/delete势必会造成内存I间的不q箋Q从而造成大量的碎片,使程序效率降低。对于栈来讲Q则不会存在q个问题Q? 因ؓ栈是先进后出的队列,他们是如此的一一对应Q以至于永远都不可能有一个内存块从栈中间弹出Q在他弹Z前,在他上面的后q的栈内容已l被弹出Q详l的 可以参考数据结构,q里我们׃再一一讨论了?
生长方向Q对于堆来讲Q生长方向是向上的,也就是向着内存地址增加的方向;对于栈来Ԍ它的生长方向是向下的Q是向着内存地址减小的方向增ѝ?
分配方式Q堆都是动态分配的Q没有静态分配的堆。栈?U分配方式:静态分配和动态分配。静态分配是~译器完成的Q比如局部变量的分配。动态分配由alloca函数q行分配Q但是栈的动态分配和堆是不同的,他的动态分配是q译器q行释放Q无需我们手工实现?
分配效率Q栈是机器系l提供的数据l构Q计机会在底层Ҏ提供支持Q分配专门的寄存器存放栈的地址Q压栈出栈都有专门的指o执行Q这决定了栈的效率? 较高。堆则是C/C++函数库提供的Q它的机制是很复杂的Q例如ؓ了分配一块内存,库函C按照一定的法Q具体的法可以参考数据结?操作pȝQ在? 内存中搜索可用的_大小的空_如果没有_大小的空_可能是由于内存碎片太多)Q就有可能调用系l功能去增加E序数据D늚内存I间Q这样就有机会分 到够大的内存Q然后进行返回。显Ӟ堆的效率比栈要低得多?
从这里我们可以看刎ͼ堆和栈相比,׃大量new/delete的用,Ҏ造成大量的内存碎片;׃没有专门的系l支持,效率很低Q由于可能引发用h? 和核心态的切换Q内存的甌Q代价变得更加昂c所以栈在程序中是应用最q泛的,q是函数的调用也利用栈d成,函数调用q程中的参数Q返回地址Q? EBP和局部变量都采用栈的方式存放。所以,我们推荐大家量用栈Q而不是用堆?
虽然栈有如此众多的好处,但是׃和堆相比不是那么灉|Q有时候分配大量的内存I间Q还是用堆好一些?
无论是堆q是栈,都要防止界现象的发生(除非你是故意使其界Q,因ؓ界的结果要么是E序崩溃Q要么是摧毁E序的堆、栈l构Q生以想不到的l果,? 是在你的程序运行过E中Q没有发生上面的问题Q你q是要小心,说不定什么时候就崩掉Q那时候debug可是相当困难的:Q?
对了Q还有一件事Q如果有人把堆栈合v来说Q那它的意思是栈,可不是堆Q呵呵,清楚了?

]]>
C++ 的“函数内联?/title><link>http://www.shnenglu.com/mydriverc/articles/35279.html</link><dc:creator>旅?/dc:creator><author>旅?/author><pubDate>Fri, 26 Oct 2007 16:23:00 GMT</pubDate><guid>http://www.shnenglu.com/mydriverc/articles/35279.html</guid><wfw:comment>http://www.shnenglu.com/mydriverc/comments/35279.html</wfw:comment><comments>http://www.shnenglu.com/mydriverc/articles/35279.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/mydriverc/comments/commentRss/35279.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mydriverc/services/trackbacks/35279.html</trackback:ping><description><![CDATA[让我们看看C++ 的“函数内联”是如何工作的。对于Q何内联函敎ͼ~译器在W号<br />表里攑օ函数的声明(包括名字、参数类型、返回值类型)。如果编译器没有发现内联?br />数存在错误,那么该函数的代码也被攑օW号表里。在调用一个内联函数时Q编译器?br />先检查调用是否正(q行cd安全查,或者进行自动类型{换,当然Ҏ有的函数<br />都一P。如果正,内联函数的代码就会直接替换函数调用,于是省去了函数调用的开<br />销。这个过E与预处理有显著的不同,因ؓ预处理器不能q行cd安全查,或者进?br />自动cd转换。假如内联函数是成员函数Q对象的地址QthisQ会被放在合适的地方Q?br />q也是预处理器办不到的?br />C++ 语言的函数内联机制既具备宏代码的效率Q又增加了安全性,而且可以自由?br />作类的数据成员。所以在C++ E序中,应该用内联函数取代所有宏代码Q“断aassert?br />恐怕是唯一的例外。assert 是仅在Debug 版本起作用的宏,它用于检查“不应该”发?br />的情cؓ了不在程序的Debug 版本和Release 版本引v差别Qassert 不应该生Q何副<br />作用。如果assert 是函敎ͼ׃函数调用会引起内存、代码的变动Q那么将DDebug<br />版本与Release 版本存在差异。所以assert 不是函数Q而是宏?img src ="http://www.shnenglu.com/mydriverc/aggbug/35279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mydriverc/" target="_blank">旅?/a> 2007-10-27 00:23 <a href="http://www.shnenglu.com/mydriverc/articles/35279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>/http://www.shnenglu.com/mydriverc/articles/35255.html旅?/dc:creator>旅?/author>Fri, 26 Oct 2007 09:47:00 GMThttp://www.shnenglu.com/mydriverc/articles/35255.htmlhttp://www.shnenglu.com/mydriverc/comments/35255.htmlhttp://www.shnenglu.com/mydriverc/articles/35255.html#Feedback0http://www.shnenglu.com/mydriverc/comments/commentRss/35255.htmlhttp://www.shnenglu.com/mydriverc/services/trackbacks/35255.htmlint main()
{
   int i=102/4*6;
   printf("%d\n",i);
   i=float(102/4)*6;
   printf("%d\n",i);
   i=float(102)/4*6;
   printf("%d\n",i);


   float a=102/4;
   float b=float(102)/4;
   printf("%f %f\n",a,b);
   return 1;
}
150
150
153
25.0000000
25.500000


]]>
C++ 中不能重载的q算W?/title><link>http://www.shnenglu.com/mydriverc/articles/35252.html</link><dc:creator>旅?/dc:creator><author>旅?/author><pubDate>Fri, 26 Oct 2007 09:30:00 GMT</pubDate><guid>http://www.shnenglu.com/mydriverc/articles/35252.html</guid><wfw:comment>http://www.shnenglu.com/mydriverc/comments/35252.html</wfw:comment><comments>http://www.shnenglu.com/mydriverc/articles/35252.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/mydriverc/comments/commentRss/35252.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mydriverc/services/trackbacks/35252.html</trackback:ping><description><![CDATA[C/C++ 里大多数q算W都可以?C++ 中被重蝲。C 的运符中只?<tt>.</tt><tt></tt>?<tt>?:</tt>Q以?<tt>sizeof</tt>Q技术上可以看作一个运符Q不可以被重载。C++ 增加了一些自qq算W,除了 <tt>:: </tt>?<tt>.* ?/tt>Q大多数都可以被重蝲?img src ="http://www.shnenglu.com/mydriverc/aggbug/35252.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mydriverc/" target="_blank">旅?/a> 2007-10-26 17:30 <a href="http://www.shnenglu.com/mydriverc/articles/35252.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>scanf 详解http://www.shnenglu.com/mydriverc/articles/34815.html旅?/dc:creator>旅?/author>Sun, 21 Oct 2007 17:24:00 GMThttp://www.shnenglu.com/mydriverc/articles/34815.htmlhttp://www.shnenglu.com/mydriverc/comments/34815.htmlhttp://www.shnenglu.com/mydriverc/articles/34815.html#Feedback0http://www.shnenglu.com/mydriverc/comments/commentRss/34815.htmlhttp://www.shnenglu.com/mydriverc/services/trackbacks/34815.htmlint scanf( const char *format, ... );

    函数 scanf() 是从标准输入?stdin 中读内容的通用子程序,可以d全部固有cd的数据ƈ自动转换成机内Ş式。scanf() ?printf() 的补函数?br />
    ?C99 中,format ?restrict 修饰?br />
    format 指向的控制串׃下三cdW组成:
       ?格式说明W?br />       ?I白W?br />       ?非空白符
    输入格式说明W前~为百分号(%)Q告?scanf() 下次d何种数据cd。这些格式说明符的清单如下表所C:
    ┏━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━?br />    ?代  码 │?           意?                        义?           ?br />    ┠────┼────────────────────────────?br />    ┃? %a   │读点?仅适用?C99)                                  ?br />    ┃? %A   │读点?仅适用?C99)                                  ?br />    ┃? %c   │读单字W?                                              ?br />    ┃? %d   │读十进制整敊W?                                          ?br />    ┃? %i   │读十进制、八q制、十六进制整敊W?                        ?br />    ┃? %e   │读点敊W?                                              ?br />    ┃? %E   │读点敊W?                                              ?br />    ┃? %f   │读点敊W?                                              ?br />    ┃? %F   │读点?仅适用?C99)                                  ?br />    ┃? %g   │读点敊W?                                              ?br />    ┃? %G   │读点敊W?                                              ?br />    ┃? %o   │读八进制数                                              ?br />    ┃? %s   │读字符串?                                              ?br />    ┃? %x   │读十六q制敊W?                                          ?br />    ┃? %X   │读十六q制敊W?                                          ?br />    ┃? %p   │读指针值?                                              ?br />    ┃? %n   │至此已d值的{h字符敊W?                              ?br />    ┃? %u   │读无符号十q制整数                                      ?br />    ┃ ?[ ]  │扫描字W集合?                                          ?br />    ┃? %%   │读 % W号(癑ֈ?                                       ?br />    ┗━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━?br />    例如Q?%s 表示M?%d 表示L数。格式串的处理顺序ؓ从左到右Q格式说明符逐一与变元表中的变元匚w。ؓ了读取长整数Q可以将 l(ell) 攑֜格式说明W的前面Qؓ了读取短整数Q可以将 h 攑֜格式说明W的前面。这些修饰符可以?d、i、o、u ?x 格式代码一起用?br />
    默认情况下,a、f、e ?g 告诉 scanf() ?float 分配数据?如果? l(ell) 攑֜q些修饰W的前面Q则 scanf() ?double 分配数据。?L 是告诉 scanf()Q接收数据的变量? long double 型变量?br />
    如果使用的现代编译器E序支持 1995 q增加的宽字W特性, 则可以与 c 格式代码一P?l 修饰W说明类?wchar_t 的宽字符指针Q也可以?s 格式代码一P?l 修饰W说明宽字符串的指针。l 修饰W也可以用于修饰扫描集,以说明宽字符?br />
    控制串中的空白符?scanf() 在输入流中蟩q一个或多个I白行。空白符可以是空?space)、制表符(tab)和新行符(newline)?本质上,控制串中的空白符?scanf() 在输入流中读Q但不保存结果,直到发现非空白字Wؓ止?br />
    非空白符?scanf() 在流中读一个匹配的字符q忽略之。例如,"%d,%d" ?scanf() 先读入一个整敎ͼd中放弃逗号Q然后读另一个整数。如未发现匹配,scanf() q回?br />
    scanf() 中用于保存读入值的变元必须都是变量指针Q即相应变量的地址?br />
    在输入流中,数据必ȝI格、制表符和新行符分割。逗号和分L不是分隔W,比如以下代码Q?br />    scanf( "%d %d", &r, &c );
接受输?10 20Q但遇到 10,20 则失败?br />
    癑ֈ?%)与格式符之间的星?*)表示L定类型的数据但不保存?/b>因此Q?br />    scanf( "%d %*c %d", &x, &y );
?10/20 的读入操作中Q?0 攑օ变量 xQ?0 攑օ y?br />
    格式命o可以说明最大域宽?在百分号(%)与格式码之间的整数用于限制从对应域读入的最大字W数。例如,希望?address d不多?20 个字W时Q可以书写成如下形式Q?br />    scanf( "%20s", address );

    如果输入的内容多于 20 个字W,则下?scanf() 从此ơ停止处开始读入?若达到最大域宽前已遇到空白符Q则对该域的ȝ卛_止;此时Qscanf() 跛_下一个域?br />
    虽然I格、制表符和新行符都用做域分割W号Q但d字符操作中却按一般字W处理。例如,对输入流 "x y" 调用Q?br />    scanf( "%c%c%c", &a, &b, &c );
q回后,x 在变?a 中,I格在变?b 中,y 在变?c 中?br />
    注意Q控制串中的其它字符Q包括空根{制表符和新行符Q都用于从输入流中匹配ƈ攑ּ字符Q被匚w的字W都攑ּ。例如,l定输入?"10t20"Q调用:
    scanf( "%dt%d", &x, &y );
把 10 ?20 分别攑ֈ x ?y 中,t 被放弃,因ؓ t 在控制串中?br />
    ANSI C 标准?scanf() 增加了一U新Ҏ,UCؓ扫描?scanset)?扫描集定义一个字W集合,可由 scanf() d其中允许的字Wƈ赋给对应字符数组?扫描集合׃Ҏ括号中的一串字W定义,左方括号前必ȝ以百分号?例如Q以下的扫描集 scanf() d字符 A、B ?CQ?br />    %[ABC]

    使用扫描集时Qscanf() q箋吃进集合中的字符q放入对应的字符数组Q直到发C在集合中的字Wؓ?x描集仅读匚w的字W?。返回时Q数l中攄?null l尾、由d字符l成的字W串?br />
    用字W?^ 可以说明补集。把 ^ 字符放ؓ扫描集的W一字符Ӟ构成其它字符l成的命令的补集合,指示 scanf() 只接受未说明的其它字W?br />    对于许多实现来说Q用q字W可以说明一个范围?例如Q以下扫描集?scanf() 接受字母 A ?ZQ?br />    %[A-Z]
    重要的是要注意扫描集是区分大写的。因此,希望扫描大、小写字W时Q应该分别说明大、小写字母?br />    scanf() q回{于成功赋值的域数的|但由于星号修饰符而读入未赋值的域不计算在内。给W一个域赋值前已出错时Q返?EOF?br />
    C99 ?scanf() 增加了几个格式修饰符Qhh、ll、j、z ?t。hh 修饰W可用于 d、i、o、u、x、X ? n。它说明相应的变元是 signed ?unsigned char |或用?n Ӟ 相应的变元是指向 long char 型变量的指针。ll 修饰W也可用?d、i、o、u、x、X ?n。它说明相应的变元是 signed 或?unsigned long long int 倹{?br />    j 格式修饰W应用于 d、i、o、u、x、X ?nQ说明匹配的变元是类?intmax_t ?uintmax_t。这些类型在 <stdint.h>; 中声明,q说明最大宽度的整数?br />    z 格式修饰W应用于 d、i、o、u、x、X ?nQ说明匹配的变元是指?size_t cd对象的指针。该cd?<stddef.h>; 中声明,q说?sizeof 的结构?br />    t 格式修饰W应用于 d、i、o、u、x、X ?nQ说明匹配的变元是指?ptrdiff_t  cd对象的指针。该cd?<stddef.h>; 中声明,q说明两个指针之间的差别?br />

例子Q?br />
# include <stdio.h>;

int main( void )
{
    char str[80], str2[80];
    int i;

    /* read a string and a integer */
    scanf( "%s%d", str, &i );

    /* read up to 79 chars into str */
    scanf( "%79s", str );

    /* skip the integer between the two strings */
    scanf( "%s%*d%s", str, str2 );

    return 0;
}


相关函数Q?br />printf() ?fscanf()?img src ="http://www.shnenglu.com/mydriverc/aggbug/34815.html" width = "1" height = "1" />

]]>
scanfhttp://www.shnenglu.com/mydriverc/articles/34814.html旅?/dc:creator>旅?/author>Sun, 21 Oct 2007 17:22:00 GMThttp://www.shnenglu.com/mydriverc/articles/34814.htmlhttp://www.shnenglu.com/mydriverc/comments/34814.htmlhttp://www.shnenglu.com/mydriverc/articles/34814.html#Feedback0http://www.shnenglu.com/mydriverc/comments/commentRss/34814.htmlhttp://www.shnenglu.com/mydriverc/services/trackbacks/34814.html   printf("%d,%d",i,j);
如果输入 1 2回R
则返?Q随机数

   scanf("%d,%d\n",&i,&j);
   printf("%d,%d",i,j);
最后按回RQ直道随便输入个东西




]]>
scanf I格http://www.shnenglu.com/mydriverc/articles/34813.html旅?/dc:creator>旅?/author>Sun, 21 Oct 2007 17:10:00 GMThttp://www.shnenglu.com/mydriverc/articles/34813.htmlhttp://www.shnenglu.com/mydriverc/comments/34813.htmlhttp://www.shnenglu.com/mydriverc/articles/34813.html#Feedback0http://www.shnenglu.com/mydriverc/comments/commentRss/34813.htmlhttp://www.shnenglu.com/mydriverc/services/trackbacks/34813.html   如果你:  
  char   c[20];  
  scanf("%s",c);  
  输入:this   is   a   c   program!  
  它接收到this后遇到空|认ؓ对应%s的数据项已结束,后面的(包含I格Q不能输入? 
  你想输入带空格的字符Ԍ只有使用gets(c);  
  但遗憄是用gets()函数一ơ只能输入一个字W串?img src ="http://www.shnenglu.com/mydriverc/aggbug/34813.html" width = "1" height = "1" />

]]>
利用指针q回动态内?/title><link>http://www.shnenglu.com/mydriverc/articles/34812.html</link><dc:creator>旅?/dc:creator><author>旅?/author><pubDate>Sun, 21 Oct 2007 17:09:00 GMT</pubDate><guid>http://www.shnenglu.com/mydriverc/articles/34812.html</guid><wfw:comment>http://www.shnenglu.com/mydriverc/comments/34812.html</wfw:comment><comments>http://www.shnenglu.com/mydriverc/articles/34812.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/mydriverc/comments/commentRss/34812.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mydriverc/services/trackbacks/34812.html</trackback:ping><description><![CDATA[void GetMemory2(char **p, int num)<br />{<br />*p = (char *)malloc(sizeof(char) * num);<br />}<br />void Test2(void)<br />{<br />char *str = NULL;<br />GetMemory2(&str, 100); // 注意参数?&strQ而不是str<br />strcpy(str, "hello");<br />cout<< str << endl;<br />free(str);<br />}<br /><br /><br /><br />char *GetMemory3(int num)<br />{<br />char *p = (char *)malloc(sizeof(char) * num);<br />return p;<br />}<br />void Test3(void)<br />{<br />char *str = NULL;<br />str = GetMemory3(100);<br />strcpy(str, "hello");<br />cout<< str << endl;<br />free(str);<br />}<br /><img src ="http://www.shnenglu.com/mydriverc/aggbug/34812.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mydriverc/" target="_blank">旅?/a> 2007-10-22 01:09 <a href="http://www.shnenglu.com/mydriverc/articles/34812.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>const char *http://www.shnenglu.com/mydriverc/articles/34811.html旅?/dc:creator>旅?/author>Sun, 21 Oct 2007 17:06:00 GMThttp://www.shnenglu.com/mydriverc/articles/34811.htmlhttp://www.shnenglu.com/mydriverc/comments/34811.htmlhttp://www.shnenglu.com/mydriverc/articles/34811.html#Feedback0http://www.shnenglu.com/mydriverc/comments/commentRss/34811.htmlhttp://www.shnenglu.com/mydriverc/services/trackbacks/34811.htmlvoid foo(const char *p)
{
  p="world";
}

int main()
{
   const char* q="Hello";
   foo(q);
   printf("%s\n",q);
   q="world";
   printf("%s\n",q);
}
Hello
world


]]>
联发W试 一个数l的使用http://www.shnenglu.com/mydriverc/articles/34810.html旅?/dc:creator>旅?/author>Sun, 21 Oct 2007 16:45:00 GMThttp://www.shnenglu.com/mydriverc/articles/34810.htmlhttp://www.shnenglu.com/mydriverc/comments/34810.htmlhttp://www.shnenglu.com/mydriverc/articles/34810.html#Feedback0http://www.shnenglu.com/mydriverc/comments/commentRss/34810.htmlhttp://www.shnenglu.com/mydriverc/services/trackbacks/34810.htmlvoid foo(int b[][3])
{
  b++;
  b[1][1]=9;
}
int main()
{
    int a[][3]={{1,2,3},{4,5,6},{7,8,9}};
    foo(a);
    printf("%d,%d\n",a[1][2],a[2][1]);
}
6Q?


]]>
memmovehttp://www.shnenglu.com/mydriverc/articles/34809.html旅?/dc:creator>旅?/author>Sun, 21 Oct 2007 16:37:00 GMThttp://www.shnenglu.com/mydriverc/articles/34809.htmlhttp://www.shnenglu.com/mydriverc/comments/34809.htmlhttp://www.shnenglu.com/mydriverc/articles/34809.html#Feedback0http://www.shnenglu.com/mydriverc/comments/commentRss/34809.htmlhttp://www.shnenglu.com/mydriverc/services/trackbacks/34809.htmlvoid * __cdecl memmove ( void * dst, const void * src, size_t count  )
{
        void * ret = dst;

        if (dst <= src || (char *)dst >= ((char *)src + count)) {
                /*
                 * Non-Overlapping Buffers
                 * copy from lower addresses to higher addresses
                 */
                while (count--) {
                        *(char *)dst = *(char *)src;
                        dst = (char *)dst + 1;
                        src = (char *)src + 1;
                }
        }
        else {
                /*
                 * Overlapping Buffers
                 * copy from higher addresses to lower addresses
                 */
                dst = (char *)dst + count - 1;
                src = (char *)src + count - 1;

                while (count--) {
                        *(char *)dst = *(char *)src;
                        dst = (char *)dst - 1;
                        src = (char *)src - 1;
                }
        }

        return(ret);
}

void * memmove(void * dest,const void *src,size_t count)
{
       char *tmp, *s;

        if (dest <= src) {
                tmp = (char *) dest;
               s = (char *) src;
                while (count--)
                        *tmp++ = *s++;
                }
         else {
                 tmp = (char *) dest + count;
                s = (char *) src + count;
                 while (count--)
                         *--tmp = *--s;
                }

        return dest;
 }



]]>
++i不生时变量,i++产生临时变量http://www.shnenglu.com/mydriverc/articles/34808.html旅?/dc:creator>旅?/author>Sun, 21 Oct 2007 16:36:00 GMThttp://www.shnenglu.com/mydriverc/articles/34808.htmlhttp://www.shnenglu.com/mydriverc/comments/34808.htmlhttp://www.shnenglu.com/mydriverc/articles/34808.html#Feedback0http://www.shnenglu.com/mydriverc/comments/commentRss/34808.htmlhttp://www.shnenglu.com/mydriverc/services/trackbacks/34808.html   i++:   {tmpobj   =   *this;   ++(*this);   return   tmpobj;}

]]>
strcathttp://www.shnenglu.com/mydriverc/articles/34807.html旅?/dc:creator>旅?/author>Sun, 21 Oct 2007 16:34:00 GMThttp://www.shnenglu.com/mydriverc/articles/34807.htmlhttp://www.shnenglu.com/mydriverc/comments/34807.htmlhttp://www.shnenglu.com/mydriverc/articles/34807.html#Feedback0http://www.shnenglu.com/mydriverc/comments/commentRss/34807.htmlhttp://www.shnenglu.com/mydriverc/services/trackbacks/34807.html  char   *   strcat(char   *   dest,   const   char   *   src)  
  {  
  char   *tmp   =   dest;  
   
  while   (*dest)  
  dest++;  
  while   ((*dest++   =   *src++)   !=   '\0')  
  ;  
   
  return   tmp;  
  }
strcat(char   *dest,   const   *src),其中Qsrc是以'\0'l尾的字W串Q通过遍历src把它的每个字W放到dest字符串里面,当遍历src遇到'\0'时结束。?strcat要防止src的长度大于dest的长度,不然数组界?br />
以下为摘?C:\Program   Files\Microsoft   Visual   Studio\VC98\CRT\SRC\strcat.cQ? 
   
  char   *   __cdecl   strcat   (  
                  char   *   dst,  
                  const   char   *   src  
                  )  
  {  
                  char   *   cp   =   dst;  
   
                  while(   *cp   )  
                                  cp++;                                       /*   find   end   of   dst   */  
   
                  while(   *cp++   =   *src++   )   ;               /*   Copy   src   to   end   of   dst   */  
   
                  return(   dst   );                                     /*   return   dst   */  
   
  }


]]>
含有中文字符串的截取问题Q?/title><link>http://www.shnenglu.com/mydriverc/articles/33995.html</link><dc:creator>旅?/dc:creator><author>旅?/author><pubDate>Thu, 11 Oct 2007 18:08:00 GMT</pubDate><guid>http://www.shnenglu.com/mydriverc/articles/33995.html</guid><wfw:comment>http://www.shnenglu.com/mydriverc/comments/33995.html</wfw:comment><comments>http://www.shnenglu.com/mydriverc/articles/33995.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/mydriverc/comments/commentRss/33995.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mydriverc/services/trackbacks/33995.html</trackback:ping><description><![CDATA[ 问题Q?br />    字符Ԍmusic<<丽的草原我的家>>。该字符串的长度即str.length()为:17Q而目前需要存入数据库对应? 字段长度为:16。所以必d字符串进行截取。而前16个字节中Q“原”字只有半个。这样存入数据库对会出现“?”。所以必d断是否是半个汉字Q即? 能存入“music<<丽的草”?br /><br />分析Q?br />    汉字是双字节~码Q它Z能够与英文字W分开Q每个字节的最高位一定ؓ1。如果是汉字Q那么这个字节就是小?的。这个函数就是通过q一原理实现的。所以要通过getBytes()转化为byte型,再比较与零的大小? <br />getBytes()是把一个字W串转成一个byte数组Q因机的数据都是基于字W的Q也是说一个字W串实际上就是一个字W流Q因此可以{为字W数l?br /><br />E序Q?br />    public  static  String  getStr(String  src,  int  len)  {  <br />       if  (src  ==  null)              return  null;  <br />       if  (src.getBytes().length  <=  len)    return  src;  <br /> <br />       byte[]  s  =  src.getBytes();  <br />       int  flag  =  0;  <br />       for(int  i=0;i<len;++i){  <br />         if(s[i]  <  0)  flag++;    <br />       }  <br />       if(flag%2!=0)  len--;          <br /> <br />       byte[]  d  =  new  byte[len];  <br />       System.arraycopy(s,  0,  d,  0,  len);  <br />       return  new  String(d);  <br />   }  <img src ="http://www.shnenglu.com/mydriverc/aggbug/33995.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mydriverc/" target="_blank">旅?/a> 2007-10-12 02:08 <a href="http://www.shnenglu.com/mydriverc/articles/33995.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ascii 字符 整数http://www.shnenglu.com/mydriverc/articles/33994.html旅?/dc:creator>旅?/author>Thu, 11 Oct 2007 17:55:00 GMThttp://www.shnenglu.com/mydriverc/articles/33994.htmlhttp://www.shnenglu.com/mydriverc/comments/33994.htmlhttp://www.shnenglu.com/mydriverc/articles/33994.html#Feedback0http://www.shnenglu.com/mydriverc/comments/commentRss/33994.htmlhttp://www.shnenglu.com/mydriverc/services/trackbacks/33994.html{
   char b='0';
   printf("%d\n",b);
   printf("%c\n",b);

   int i=48;
   printf("%d\n",i);
   printf("%c\n",i);
   return 1;
}
48
0
48
0

表现形式不同?br />

]]>
国标准信息交换标准?(ASCII)http://www.shnenglu.com/mydriverc/articles/33993.html旅?/dc:creator>旅?/author>Thu, 11 Oct 2007 17:49:00 GMThttp://www.shnenglu.com/mydriverc/articles/33993.htmlhttp://www.shnenglu.com/mydriverc/comments/33993.htmlhttp://www.shnenglu.com/mydriverc/articles/33993.html#Feedback0http://www.shnenglu.com/mydriverc/comments/commentRss/33993.htmlhttp://www.shnenglu.com/mydriverc/services/trackbacks/33993.html~码ҎQ用于基于文本的数据。v始于50q代后期Q在1967q定案。它最初是国国家标准Q供不同计算机在怺通信时用作共同遵守的西文字符~码标准Q后被ISO及CCITT{国际组l采用?br />
       ASCII 码用指定的 7 位或 8 位二q制数组合来表示 128 ?256 U可能的字符。标?ASCII 码?7 位二q制数来表示所有的大写和小写字母,数字 0 ?9、标点符P以及在美式英语中使用的特D控制字W。目前许多基?a target="_blank" >x86的系l都支持使用扩展Q或“高”)ASCII。扩?ASCII 码允许将每个字符的第 8 位用于确定附加的 128 个特D符号字W?a target="_blank" >外来?/a>字母和图形符受?br />
       ?8??0 ?13 分别转换为退根{制表、换行和回R字符。它们ƈ没有特定的图形显C,但会依不同的应用E序Q而对文本昄有不同的影响

控制字符
二进制?        十进?十六q制 ~写    解释
0000 0000    0          00            NUL    I字W?Null)
0000 0001    1          01            SOH    标题开?
0000 0010    2          02            STX    正文开?
0000 0011    3          03            ETX    正文l束
0000 0100    4          04            EOT    传输l束
0000 0101    5          05            ENQ    h
0000 0110    6          06            ACK    收到通知
0000 0111    7          07            BEL    响铃
0000 1000    8          08            BS      退?
0000 1001    9          09            HT      水^制表W?
0000 1010    10        0A            LF      换行?
0000 1011    11        0B            VT      垂直制表W?
0000 1100    12        0C            FF      换页?
0000 1101    13        0D            CR      回R?
0000 1110    14        0E            SO      不用切换
0000 1111    15        0F            SI        启用切换
0001 0000    16        10            DLE    数据链\转义
0001 0001    17        11            DC1    讑֤控制1
0001 0010    18        12            DC2    讑֤控制2
0001 0011    19        13            DC3    讑֤控制3
0001 0100    20        14            DC4    讑֤控制4
0001 0101    21        15            NAK    拒绝接收
0001 0110    22        16            SYN    同步I闲
0001 0111    23        17            ETB    传输块结?
0001 1000    24        18            CAN    取消
0001 1001    25        19            EM      介质中断
0001 1010    26        1A            SUB    替补
0001 1011    27        1B            ESC    溢出
0001 1100    28        1C            FS      文g分割W?
0001 1101    29        1D            GS      分组W?
0001 1110    30        1E            RS      记录分离W?
0001 1111    31        1F            US      单元分隔W?
0111 1111    127      7F            DEL      删除

可显C字W?br /> 二进制?        十进?十六q制 字符
0010 0000    32        20            I格
0010 0001    33        21            !
0010 0010    34        22            "
0010 0011    35        23            #
0010 0100    36        24            $
0010 0101    37        25            %
0010 0110    38        26            &amp;
0010 0111    39        27            '
0010 1000    40        28            (
0010 1001    41        29            )
0010 1010    42        2A            *
0010 1011    43        2B            +
0010 1100    44        2C            ,
0010 1101    45        2D            -
0010 1110    46        2E            .
0010 1111    47        2F            /
0011 0000    48        30            0
0011 0001    49        31            1
0011 0010    50        32            2
0011 0011    51        33            3
0011 0100    52        34            4
0011 0101    53        35            5
0011 0110    54        36            6
0011 0111    55        37            7
0011 1000    56        38            8
0011 1001    57        39            9
0011 1010    58        3A            :
0011 1011    59        3B            ;
0011 1100    60        3C            &lt;
0011 1101    61        3D            =
0011 1110    62        3E            &gt;
0011 1111    63        3F            ?
0100 0000    64        40            @

可显C字W?br /> 二进制?        十进?十六q制 字符
0100 0001    65        41            A
0100 0010    66        42            B
0100 0011    67        43            C
0100 0100    68        44            D
0100 0101    69        45            E
0100 0110    70        46            F
0100 0111    71        47            G
0100 1000    72        48            H
0100 1001    73        49            I
0100 1010    74        4A            J
0100 1011    75        4B            K
0100 1100    76        4C            L
0100 1101    77        4D            M
0100 1110    78        4E            N
0100 1111    79        4F            O
0101 0000    80        50            P
0101 0001    81        51            Q
0101 0010    82        52            R
0101 0011    83        53            S
0101 0100    84        54            T
0101 0101    85        55            U
0101 0110    86        56            V
0101 0111    87        57            W
0101 1000    88        58            X
0101 1001    89        59            Y
0101 1010    90        5A            Z
0101 1011    91        5B            [
0101 1100    92        5C            \
0101 1101    93        5D            ]
0101 1110    94        5E            ^
0101 1111    95        5F            _
0110 0000    96        60            `

可显C字W?br /> 二进制?        十进?十六q制 字符
0110 0001    97        61            a
0110 0010    98        62            b
0110 0011    99        63            c
0110 0100    100      64            d
0110 0101    101      65            e
0110 0110    102      66            f
0110 0111    103      67            g
0110 1000    104      68            h
0110 1001    105      69            i
0110 1010    106      6A            j
0110 1011    107      6B            k
0110 1100    108      6C            l
0110 1101    109      6D            m
0110 1110    110      6E            n
0110 1111    111      6F            o
0111 0000    112      70            p
0111 0001    113      71            q
0111 0010    114      72            r
0111 0011    115      73            s
0111 0100    116      74            t
0111 0101    117      75            u
0111 0110    118      76            v
0111 0111    119      77            w
0111 1000    120      78            x
0111 1001    121      79            y
0111 1010    122      7A            z
0111 1011    123      7B            {
0111 1100    124      7C            |
0111 1101    125      7D            }
0111 1110    126      7E            ~

]]>
㽶aaþëƬ| þ޾Ʒ| ҹŷƷþþþþþ| ޾Ʒ˾þþ| þþþƷþþþɫӰ| ŷþþþƷ| ŮþþŮ| Ʒ99þþþþլС˵ | 99þֻоƷ| ˾þþƷ鶹| ŷƷһþĻ| Ʒþþþþ | þþƷavպ| 97þþƷ | Ʒһþ㽶߿ۿ| ޾Ʒþþþsm| þպƷһ| ղƷþþþþþ| www.þ.com| ƷþþӰ㽶 | ˾þۺ| 91޹˾þþƷ| þþƷƷ| ձþþҹƷ| ޾Ʒþ| ձƷþþĻ| ŷպƷþþþ| ӰȷŮAV³ɫԴþ| þݺҹҹ2O2O| ձƬҹþ| ľƷ99þù| ˾þþƷһ| һƷþþ޹| ޹ƷۺϾþ| av˾þۺɫ| ޹˾þþƷ| þþƷhþþƷ帣ӰԺ1421| ĻƷѾþ| ƷþþþAV| ݾƷŮ˾þþþþ| ŷպþĻ|