??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久久久无码Av成人影院,国产精品久久久福利,伊人久久一区二区三区无码http://www.shnenglu.com/geforcex/zh-cnFri, 09 May 2025 02:57:13 GMTFri, 09 May 2025 02:57:13 GMT60讲讲volatile的作??http://www.shnenglu.com/geforcex/archive/2008/07/27/57316.htmlhalCodehalCodeSun, 27 Jul 2008 13:56:00 GMThttp://www.shnenglu.com/geforcex/archive/2008/07/27/57316.htmlhttp://www.shnenglu.com/geforcex/comments/57316.htmlhttp://www.shnenglu.com/geforcex/archive/2008/07/27/57316.html#Feedback0http://www.shnenglu.com/geforcex/comments/commentRss/57316.htmlhttp://www.shnenglu.com/geforcex/services/trackbacks/57316.html    1). q行讑֤的硬件寄存器Q如Q状态寄存器Q?
    2). 一个中断服务子E序中会(x)讉K到的非自动变?Non-automatic variables)
    3). 多线E应用中被几个Q务共享的变量
    回答不出q个问题的h是不?x)被雇䄦的。我认ؓ(f)q是区分CE序员和嵌入式系l程序员的最基本的问题。嵌入式pȝE序员经常同g、中断、RTOS{等打交道,所用这些都要求volatile变量。不懂得volatile内容会(x)带来N?
    假设被面试者正地回答了这是问题(嗯,怀疑这否会(x)是这P(j)Q我稍微深I一下,看一下这家伙是不是直正懂得volatile完全的重要性?
    1). 一个参数既可以是constq可以是volatile吗?解释Z么?
    2). 一个指针可以是volatile 吗?解释Z么?
    3). 下面的函数有什么错误:(x)
         int square(volatile int *ptr)
         {
              return *ptr * *ptr;
         }
    下面是答案:(x)
    1). 是的。一个例子是只读的状态寄存器。它是volatile因ؓ(f)它可能被意想不到地改变。它是const因ؓ(f)E序不应该试囑֎修改它?
    2). 是的。尽这q不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时?
    3). q段代码的有个恶作剧。这D代码的目的是用来返指针*ptr指向值的qxQ但是,׃*ptr指向一个volatile型参敎ͼ~译器将产生cM下面的代码:(x)
    int square(volatile int *ptr)  
    {
         int a,b;
         a = *ptr;
         b = *ptr;
         return a * b;
     }
    ׃*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,q段代码可能q不是你所期望的^方|正确的代码如下:(x)
     long square(volatile int *ptr)  
     {
            int a;
            a = *ptr;
            return a * a;
     }

讲讲我的理解Q?Q欢q打板子...~~Q)(j)

关键在于两个地方Q?nbsp;     
  
1. ~译器的优化  (请高手帮我看看下面的理解)

在本ơ线E内, 当读取一个变量时Qؓ(f)提高存取速度Q编译器优化时有时会(x)先把变量dC个寄存器中;以后Q再取变量值时Q就直接从寄存器中取|

当变量值在本线E里改变Ӟ?x)同时把变量的新值copy到该寄存器中Q以便保持一?

当变量在因别的线E等而改变了|该寄存器的g?x)相应改变,从而造成应用E序d的值和实际的变量g一?

当该寄存器在因别的线E等而改变了|原变量的g?x)改变,从而造成应用E序d的值和实际的变量g一?nbsp; 


举一个不太准的例子Q?nbsp; 

发薪资时Q会(x)计每ơ都把员工叫来登C们的银行卡号Q一ơ会(x)计ؓ(f)了省事,没有x登记Q用了以前登记的银行卡号Q刚好一个员工的银行卡丢了,已挂p银行卡号Q从而造成该员工领不到工资  

员工 Q- 原始变量地址  
银行卡号 Q- 原始变量在寄存器的备?nbsp; 


2. 在什么情况下?x)出??楼所?

    1). q行讑֤的硬件寄存器Q如Q状态寄存器Q?nbsp; 
    2). 一个中断服务子E序中会(x)讉K到的非自动变?Non-automatic variables)  
    3). 多线E应用中被几个Q务共享的变量  
    

补充Q?volatile应该解释?#8220;直接存取原始内存地址”比较合适,“易变?#8221;q种解释直有点误ghQ?nbsp; 

“易变”是因为外在因素引L(fng)Q象多线E,中断{,q不是因为用volatile修饰了的变量是“易变”了,假如没有外因Q即使用volatile定义Q它也不?x)变化?

而用volatile定义之后Q其实这个变量就不会(x)因外因而变化了Q可以放心用了Q?大家看看前面那种解释Q易变的Q是不是在误gh


Q-Q-Q-Q-Q-Q-明示例如下:(x)Q-Q-Q-Q-Q-Q-Q-Q-Q?wbr>Q?

volatile关键字是一U类型修饰符Q用它声明的cd变量表示可以被某些编译器未知的因素更改,比如Q操作系l、硬件或者其它线E等。遇到这个关键字声明的变量,~译器对讉K该变量的代码׃再进行优化,从而可以提供对Ҏ(gu)地址的稳定访问?
使用该关键字的例子如下:(x)
int volatile nVint;
>>>>当要求用volatile 声明的变量的值的时候,pȝL重新从它所在的内存d数据Q即使它前面的指令刚刚从该处dq数据。而且d的数据立刻被保存?
例如Q?
volatile int i=10;
int a = i;
...
//其他代码Qƈ未明告诉编译器Q对iq行q操?
int b = i;
>>>>volatile 指出 i是随时可能发生变化的Q每ơ用它的时候必Mi的地址中读取,因而编译器生成的汇~代码会(x)重新从i的地址d数据攑֜b中。而优化做法是Q由于编译器发现两次从iL据的代码之间的代码没有对iq行q操作,它会(x)自动把上ơ读的数据放在b中。而不是重Ci里面诅R这样以来,如果i是一个寄存器变量或者表CZ个端口数据就Ҏ(gu)出错Q所以说volatile可以保证对特D地址的稳定访问?
>>>>注意Q在vc6中,一般调试模式没有进行代码优化,所以这个关键字的作用看不出来。下面通过插入汇编代码Q测试有无volatile关键字,对程序最l代码的影响Q?
>>>>首先Q用classwizardZ个win32 console工程Q插入一个voltest.cpp文gQ输入下面的代码Q?
>>
Qi nclude <stdio.h>
void main()
{
int i=10;
int a = i;
printf("i= %d",a);
//下面汇编语句的作用就是改变内存中i的|但是又不让编译器知道
__asm {
mov dword ptr [ebp-4], 20h
}
int b = i;
printf("i= %d",b);
}      
然后Q在调试版本模式q行E序Q输出结果如下:(x)
i = 10
i = 32
然后Q在release版本模式q行E序Q输出结果如下:(x)
i = 10
i = 10
输出的结果明显表明,release模式下,~译器对代码q行了优化,W二ơ没有输出正的i倹{下面,我们?i的声明加上volatile关键字,看看有什么变化:(x)
Qi nclude <stdio.h>
void main()
{
volatile int i=10;
int a = i;
printf("i= %d",a);
__asm {
mov dword ptr [ebp-4], 20h
}
int b = i;
printf("i= %d",b);
}      
分别在调试版本和release版本q行E序Q输出都是:(x)
i = 10
i = 32
q说明这个关键字发挥了它的作用!

Q-Q-Q-Q-Q-Q-Q-Q-Q?wbr>Q-Q-Q-Q-Q-Q-Q-Q-Q-Q?


volatile对应的变量可能在你的E序本n不知道的情况下发生改?
比如多线E的E序Q共同访问的内存当中Q多个程序都可以操纵q个变量
你自qE序Q是无法判定合适这个变量会(x)发生变化
q比如,他和一个外部设备的某个状态对应,当外部设备发生操作的时候,通过驱动E序和中断事Ӟpȝ改变了这个变量的数|而你的程序ƈ不知道?
对于volatilecd的变量,pȝ每次用到他的时候都是直接从对应的内存当中提取,而不?x)利用cache当中的原有数|以适应它的未知何时?x)发生的变化Q系l对q种变量的处理不?x)做优化——显然也是因为它的数值随旉可能变化的情c(din)?

--------------------------------------------------------------------------------

典型的例?
for ( int i=0; i<100000; i++);
q个语句用来试I@环的速度?
但是~译器肯定要把它优化掉,Ҏ(gu)׃执行
如果你写?nbsp; 
for ( volatile int i=0; i<100000; i++);
它就?x)执行?

volatile的本意是“易变?#8221;  
׃讉K寄存器的速度要快qRAMQ所以编译器一般都?x)作减少存取外部RAM的优化。比如:(x)

static int i=0;

int main(void)
{
...
while (1)
{
if (i) dosomething();
}
}

/* Interrupt service routine. */
void ISR_2(void)
{
i=1;
}

E序的本意是希望ISR_2中断产生Ӟ在main当中调用dosomething函数Q但是,׃~译器判断在main函数里面没有修改qiQ因?
可能只执行一ơ对从i到某寄存器的L作,然后每次if判断都只使用q个寄存器里面的“i副本”Q导致dosomething永远也不?x)?
调用。如果将变量加上volatile修饰Q则~译器保证对此变量的d操作都不?x)被优化Q肯定执行)(j)。此例中i也应该如此说明?

一般说来,volatile用在如下的几个地方:(x)

1、中断服务程序中修改的供其它E序(g)的变量需要加volatileQ?

2、多d环境下各d间共享的标志应该加volatileQ?

3、存储器映射的硬件寄存器通常也要加volatile说明Q因为每ơ对它的d都可能由不同意义Q?

另外Q以上这几种情况l常q要同时考虑数据的完整性(怺兌的几个标志读了一半被打断了重写)(j)Q在1中可以通过关中断来?
玎ͼ2中可以禁止Q务调度,3中则只能依靠g的良好设计了?

halCode 2008-07-27 21:56 发表评论
]]>
一个老工E师的话Q{载)(j)http://www.shnenglu.com/geforcex/archive/2006/04/11/5266.htmlhalCodehalCodeTue, 11 Apr 2006 02:51:00 GMThttp://www.shnenglu.com/geforcex/archive/2006/04/11/5266.htmlhttp://www.shnenglu.com/geforcex/comments/5266.htmlhttp://www.shnenglu.com/geforcex/archive/2006/04/11/5266.html#Feedback2http://www.shnenglu.com/geforcex/comments/commentRss/5266.htmlhttp://www.shnenglu.com/geforcex/services/trackbacks/5266.html 
[1]好好规划自己的\Q不要跟着感觉赎ͼҎ(gu)个h的理惛_{安排,l大部分人ƈ不指望成Z么院士或教授Q而是希望zd滋润一些,爽一些。那么,需要慎重安排自q轨迹。从哪个行业入手Q逐渐对该行业深入了解Q不要频J蟩槽,特别是不要ؓ(f)了一点工资而{U阵圎ͼ从长q看Q这炚wҎ(gu)不算什么,当你对一个行业有那么几年的体?x),以后钱根本不是问题。频J地动荡不是上策Q最后你对哪个行业都没有摔R,永远是新手!
 
[2]可以做技术,切不可沉湎于技术。千万不可一门心思钻研技术!l自己很大压力,如果你的心思全部放在这上面Q那么注定你成为孔乙己一cȝ人物Q适可而止ZQ因为技术只不过是你今后前途的支柱之一Q而且q不是最大的支柱?br /> 
[3]不要d技术高手,只去做综合素质高手!在企业里P我们时常瞧不h人,说他“什么都不懂Q凭啥拿那么多钱Q凭啥升官!”这是普遍的典型的工E师的迂腐之a?051很牛吗?人家能上d然有他的本事Q而且是你没有的本事。你xQ老板搞经营那么多q_(d)N见识不如你这个新兵?人家或许善于理Q善于领?x)老板意图Q善于部门协调等{。因此务必培养自己多斚w的能力,包括理Q亲和力Q察a观色能力Q攻兌力等Q要成ؓ(f)l合素质的高手,则前途无量,否则只能w在角落看示波器Q技术以外的技能才是更重要的本事!Q从古到今,国日本Q一律如此!
 
[4]多交C会(x)三教?ji)流的朋友!不要只和工程师交往Q认为有共同语言Q其实更重要的是和其他类人物交往Q如果你希望有朝一日当老板或高层管理,那么你整日面对的是q些人。了解他们的l历Q思维?fn)惯Q爱好,学习(fn)他们处理问题的模式,了解C会(x)各个角落的现象和问题Q这是以后发展的巨大的本钱?br /> 
[6]抓住时机向技术管理或?jng)场销售方面的转变Q要x前途就不能一直搞开发,适当时候要转变为管理或销售,前途会(x)更大Q以前搞技术也没有白搞Q以后还用得着。搞理可以培养自己的领D力,搞销售可以培养自q?jng)场概念和思维Q同时ؓ(f)自己以后发展U篏庞大的h脉!应该说这才是前途的真正支柱Q?br /> 
[7]逐渐克服自己的心里弱点和性格~陷Q多疑,敏感Q天真(贬义Qƈ不可爱)(j)Q犹豫不冻I胆怯,多虑Q脸皮太薄,心不够黑Q教条式思维。。。这些工E师普遍存在的性格q必须改变Q很隑֐Q只在床上想一惛_然不可能Q去帮朋友守一个月地摊Q包准有效果Q去实践Q而不要只惻I不克服这些缺点,一切不可能Q甚臌目l理都当不好--管你可能技术不错!
 
[8]工作的同时要Z后做准备Q徏立自q工作环境Q及(qing)早ؓ(f)自己配置一个工作环境,装备?sh)脑Q示波器Q可以买个二手的Q,仿真器,~程器等Q业余可以接Ҏ(gu)Q一斚w接触?jng)场Q培d(jng)场感觉,同时也积累资金,更重要的是准备自q产品Q咱搞技术的没有钱,只有技术,技术的代表不是学历和证书,而是产品Q拿L(fng)产品Q就可技术{让或与h合作搞企业!先把东西准备好,{待Z(x)Q否则,有了Z(x)也抓不住Q?br /> 
[9]要学?x)善于推销自己Q不仅要能干Q还要能_(d)能写Q善于利用一切机?x)推销自己Q树(wi)立自q品牌形象Q很必要Q要创造条件让别h了解自己Q不然老板怎么知道你能qԌ外面的投资h怎么怿你?提早把自己推销出去Q机?x)自然?x)来找你!搞个个h主页是个好注意!Q特别是培养自己在行业的名气Q有了名气,高薪Z(x)自不在话下,更重要的是有合作的机?.....

[10]该出手时便出手!永远不可能有100%把握Q!Q条件差不多p大胆dQ去闯出自己的事业,不要犹UQ不要彷徨,q了不一定成功,但至ؓ(f)下一ơ冲ȝ累了l验Q不q永q没出息Q而且要干成必然要l历p|。不l历风雨Q怎么见彩虹,没有随随便便成功Q?img src ="http://www.shnenglu.com/geforcex/aggbug/5266.html" width = "1" height = "1" />

halCode 2006-04-11 10:51 发表评论
]]>
用socket~写C(j)/Sl构E序的流E图http://www.shnenglu.com/geforcex/archive/2006/03/23/4506.htmlhalCodehalCodeThu, 23 Mar 2006 13:11:00 GMThttp://www.shnenglu.com/geforcex/archive/2006/03/23/4506.htmlhttp://www.shnenglu.com/geforcex/comments/4506.htmlhttp://www.shnenglu.com/geforcex/archive/2006/03/23/4506.html#Feedback0http://www.shnenglu.com/geforcex/comments/commentRss/4506.htmlhttp://www.shnenglu.com/geforcex/services/trackbacks/4506.html借用别h的流E图提醒自己~程的步?br />

1.面向q接的套接字的系l调用时序图



无连接协议的套接字调用时序图

面向q接的应用程序流E图





halCode 2006-03-23 21:11 发表评论
]]>
谈恋?大学??/title><link>http://www.shnenglu.com/geforcex/archive/2006/03/21/4402.html</link><dc:creator>halCode</dc:creator><author>halCode</author><pubDate>Tue, 21 Mar 2006 02:34:00 GMT</pubDate><guid>http://www.shnenglu.com/geforcex/archive/2006/03/21/4402.html</guid><wfw:comment>http://www.shnenglu.com/geforcex/comments/4402.html</wfw:comment><comments>http://www.shnenglu.com/geforcex/archive/2006/03/21/4402.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/geforcex/comments/commentRss/4402.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/geforcex/services/trackbacks/4402.html</trackback:ping><description><![CDATA[大学?吃饭+睡觉+谈恋?br />?吃饭+睡觉<br />所?大学??谈恋?br />以上推出 大学?谈恋??br />?大学生不谈恋q都是猪?<br />同理得出 猪只要谈恋爱可以变成大学生 <img src ="http://www.shnenglu.com/geforcex/aggbug/4402.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/geforcex/" target="_blank">halCode</a> 2006-03-21 10:34 <a href="http://www.shnenglu.com/geforcex/archive/2006/03/21/4402.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>李安获奖感言Q?/title><link>http://www.shnenglu.com/geforcex/archive/2006/03/06/3826.html</link><dc:creator>halCode</dc:creator><author>halCode</author><pubDate>Mon, 06 Mar 2006 11:59:00 GMT</pubDate><guid>http://www.shnenglu.com/geforcex/archive/2006/03/06/3826.html</guid><wfw:comment>http://www.shnenglu.com/geforcex/comments/3826.html</wfw:comment><comments>http://www.shnenglu.com/geforcex/archive/2006/03/06/3826.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/geforcex/comments/commentRss/3826.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/geforcex/services/trackbacks/3826.html</trackback:ping><description><![CDATA[<P><IMG style="WIDTH: 401px; HEIGHT: 500px" alt=李安h?jng)_演奖 hspace=0 src="http://photocdn.sohu.com/20060306/Img242149555.jpg" align=left border=0><FONT color=#008000>“首先要感谢很多在场和不在场的hQ像制作人Ann Li,~剧DianaQJack~~我觉得《断背山》是属于我李安一个h的,如果被其他h拍了Q我会(x)很生气!q部?sh)?jing)既不是关于同性恋Q女人,爱情Q而是q本n?</FONT> <TABLE cellSpacing=0 cellPadding=0 align=left border=0> <TBODY> <TR> <TD vAlign=top><FONT color=#008000></FONT></TD></TR> <TR> <TD><FONT color=#008000></FONT></TD></TR></TBODY></TABLE><FONT color=#008000>谢谢大家的支持,谢谢我的d和儿子,我爱你们Q我永q和你们同在。虽然在期间我的父亲不幸q世Q但是要感谢我家中的妈妈Q还有中国台湾,香港和内地的同胞(yu)们。最后,谢谢大家的关心!?BR></FONT><BR>看到q段话时Q我十分感动Q尤其是“但是要感谢我家中的妈妈Q还有中国台湾,香港和内地的同胞(yu)们。”体C一U难得的亲情Q而且在拿到国际电(sh)׃最高荣誉的奖项Ӟ不忘记自己是名中国hQ不忘记把台湾说成“中国台䏀?BR><BR>然而我注意到这句话的表q有Ҏ(gu)怪的Q是不是他自q原话呢?我最不愿意怀疑的是“中国台䏀几个字。于是我查看了sohuq段新闻下网友的评论Q发现原文是q样的:(x)?FONT color=#333333>And finally, to my mother and family, and everybody in Taiwan, Hong Kong and China. Thank you. </FONT>”,他说的是“台湾、香港和中国”。。。。?BR><BR>管他是所有华人的?jing)傲Q尽也总q没有太在意他的表述Q但是。。我多少q是有些失望的。。。?/P><img src ="http://www.shnenglu.com/geforcex/aggbug/3826.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/geforcex/" target="_blank">halCode</a> 2006-03-06 19:59 <a href="http://www.shnenglu.com/geforcex/archive/2006/03/06/3826.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SetWindowPoshttp://www.shnenglu.com/geforcex/archive/2006/03/01/3605.htmlhalCodehalCodeWed, 01 Mar 2006 09:30:00 GMThttp://www.shnenglu.com/geforcex/archive/2006/03/01/3605.htmlhttp://www.shnenglu.com/geforcex/comments/3605.htmlhttp://www.shnenglu.com/geforcex/archive/2006/03/01/3605.html#Feedback0http://www.shnenglu.com/geforcex/comments/commentRss/3605.htmlhttp://www.shnenglu.com/geforcex/services/trackbacks/3605.html
BOOL SetWindowPos(
   
const CWnd* pWndInsertAfter,
   
int x,
   
int y,
   
int cx,
   
int cy,
   UINT nFlags 
);

Parameters

pWndInsertAfter
Identifies the CWnd object that will precede this CWnd object in the Z-order. This parameter can be a pointer to a CWnd or a Pointer to one of the following values:
  • wndBottom   Places the window at the bottom of the Z-order. If this CWnd is a topmost window, the window loses its topmost status; the system places the window at the bottom of all other windows.
  • wndTop   Places the window at the top of the Z-order.
  • wndTopMost   Places the window above all nontopmost windows. The window maintains its topmost position even when it is deactivated.
  • wndNoTopMost   Repositions the window to the top of all nontopmost windows (that is, behind all topmost windows). This flag has no effect if the window is already a nontopmost window.
nFlags
Specifies sizing and positioning options. This parameter can be a combination of the following: 常用的是SWP_SHOWWINDOW

注意Q?BR>    q里的坐标参数用的是Client坐标Q对于子H口用的是其父窗口的坐标pR然而对于用DoModal()弹出的窗口,如果在资源属性里没有选择Child属性的话,它的父窗口是DeskTopQ而不是调用DoModal()的窗口?BR>


halCode 2006-03-01 17:30 发表评论
]]>
MoveWindowhttp://www.shnenglu.com/geforcex/archive/2006/02/28/3574.htmlhalCodehalCodeTue, 28 Feb 2006 07:44:00 GMThttp://www.shnenglu.com/geforcex/archive/2006/02/28/3574.htmlhttp://www.shnenglu.com/geforcex/comments/3574.htmlhttp://www.shnenglu.com/geforcex/archive/2006/02/28/3574.html#Feedback0http://www.shnenglu.com/geforcex/comments/commentRss/3574.htmlhttp://www.shnenglu.com/geforcex/services/trackbacks/3574.html刚做的那个Y件界面很重要Q就象是把自己做的一个个控g|上MPq要按照实际q行效果来不断调整位|,很麻?ch)。当时用MoveWindow()q个函数来控制对话框的大和位置Q不了解参数情况Q在|上查了Q记得好象放在这里备忘,那时q觉得blog真是方便。结果现在又要用赯个函数却又找不到了!不知道是不是攑֜q个blog里了。看来blog多了q不方便了。不q不要误?x),那些都是以前扑ֈq个blog之前暂时用的Q都不太满意。最后觉得还是这里好QhohoQ方ѝ晕Q我来写q篇日志是干吗的Q这么扯到这么远了。。。不说了Q还是把MoveWindow()再脓(chung)一下吧。?/P>
BOOL MoveWindow
(   HWND hWnd,      
//Handle to the window
    int X,                      //Specifies the new position of the left side of the window.
    int Y,                      //Specifies the new position of the top of the window.
    int nWidth,
    
int nHeight,
    BOOL bRepaint
);

q个?API函数Q如果在MFC中用CWnd::MoveWindow则不需要第一个参数句柄hWndQ其他相同?img src ="http://www.shnenglu.com/geforcex/aggbug/3574.html" width = "1" height = "1" />

halCode 2006-02-28 15:44 发表评论
]]>
一句名ahttp://www.shnenglu.com/geforcex/archive/2005/12/29/2235.htmlhalCodehalCodeThu, 29 Dec 2005 06:17:00 GMThttp://www.shnenglu.com/geforcex/archive/2005/12/29/2235.htmlhttp://www.shnenglu.com/geforcex/comments/2235.htmlhttp://www.shnenglu.com/geforcex/archive/2005/12/29/2235.html#Feedback0http://www.shnenglu.com/geforcex/comments/commentRss/2235.htmlhttp://www.shnenglu.com/geforcex/services/trackbacks/2235.html

halCode 2005-12-29 14:17 发表评论
]]>
一个关于指针的问题http://www.shnenglu.com/geforcex/archive/2005/12/21/1936.htmlhalCodehalCodeWed, 21 Dec 2005 02:55:00 GMThttp://www.shnenglu.com/geforcex/archive/2005/12/21/1936.htmlhttp://www.shnenglu.com/geforcex/comments/1936.htmlhttp://www.shnenglu.com/geforcex/archive/2005/12/21/1936.html#Feedback0http://www.shnenglu.com/geforcex/comments/commentRss/1936.htmlhttp://www.shnenglu.com/geforcex/services/trackbacks/1936.html
char *pStr;
char ch;
char str[] = "Hello";

ch 
= str[1];
*pStr = str[1];

printf(
"ch = %c\n", ch);
printf(
"*pStr = %c"*pStr);

此时打印ch值的时候能正确输出Q但是打印pStr[0]的时候就出问题了Q跟t发现是pStr[0] = str[1];q句出现问题?BR>
原来Qchar *pStr; 只定义了一?字节的指针变量,而这个变量里面的内容是将要指向一个charcd变量的,但是此时pStr只是个“野指针”,q没有指向一个charcd的内存单元,所以,当用*pStr来访问这个元素时Q系l根本不知道该访问何处的I间Q因此,在用pStr前,必须让它指向一个具体的I间?BR>
׃面可以将相关语句改ؓ(f)
char *pStr;
char ch;
char str[] = "Hello";

pStr 
= &ch;    //pStr指向ch、获得初始化
pStr = &str[1];  //pStr指向str[1]地址、获得初始化
ch = str[1];
*pStr = str[1];

printf(
"ch = %c\n", ch);
printf(
"*pStr = %c"*pStr);
也就是说Q要先给指针一个地址值初始化它,然后才能?讉K它指向的内容?BR>


◎另外,在子函数中用malloc()/new()分配的内存空间不?x)因子函数的q回而消?/FONT>Q函数只?x)清理调子函数里定义的变量的I间Q如Q?
char* func()
{
  
char *p;
  p 
= (char *)malloc(sizeof(char));
  
  
return p;
}
  //q回后,p所在空间被释放Q但是p所指空间还存在
所以,可以用p1=func();来获得在func()中分配的I间?BR>
此中Ҏ(gu)可以用来解决“指针的指针”用不方便的问题。步骤分2步:(x)1、把传入的指针的指针参数LQ?、把函数的返回Dl要改变的对象的指针Q?
void GetMemory2(char **p, int num)
{
  
*= (char *)malloc(sizeof(char* num);
}

void Test2(void)
{
  
char *str = NULL;
  GetMemory2(
&str, 100);   // 注意参数?nbsp;&strQ而不是str
  strcpy(str, "hello");    
  cout
<< str << endl;
  free(str);    
}


//////下面是用传递动态内存的Ҏ(gu)实现
char *GetMemory3(int num)
{
  
char *= (char *)malloc(sizeof(char* num);
  
return p;
}

void Test3(void)
{
  
char *str = NULL;
  str 
= GetMemory3(100);    
  strcpy(str, 
"hello");
  cout
<< str << endl;
  free(str);    
}

因ؓ(f)此时用malloc/new分配的内存空间是堆里面的Q函数返回时不会(x)回收Q而如果在子函C用char p[]="asdfgewq";则p是在栈中定义的(先分配p的空_(d)然后讲字W串拯q去Q跟char *p="asdfasdf"分配在全局静态内存中不一P(j)Q所以会(x)被系l收回?img src ="http://www.shnenglu.com/geforcex/aggbug/1936.html" width = "1" height = "1" />

halCode 2005-12-21 10:55 发表评论
]]>
数组和指针的比较http://www.shnenglu.com/geforcex/archive/2005/12/18/1863.htmlhalCodehalCodeSun, 18 Dec 2005 13:40:00 GMThttp://www.shnenglu.com/geforcex/archive/2005/12/18/1863.htmlhttp://www.shnenglu.com/geforcex/comments/1863.htmlhttp://www.shnenglu.com/geforcex/archive/2005/12/18/1863.html#Feedback0http://www.shnenglu.com/geforcex/comments/commentRss/1863.htmlhttp://www.shnenglu.com/geforcex/services/trackbacks/1863.html      而指针变量只需要指定类型,pȝ只ؓ(f)该指针变量分?字节Q?2位机Q内存,而不?x)?f)该变量所指内容分配内存?BR>
2。指针变量是有存储空间的Q而数l名仅仅是一个标P没有实际存储I间Q单单一个数l名只能表C数组的第1个元素的地址。int a[10]; 规定&aq?amp;a[0]或者a .

3。例?char str[]= "hello world"和char *p = "hello world"中,数组str是先分配l他元素个数个内存,然后后面的字符串复制给q个I间Q注意,此时应该考虑\0字符Q;而p的徏立过E是先在静态存储区建立常字W串"hello world\0"Q然后将p指向q个常字W串。所以数lstr中元素的内容可以通过重新赋值改变,而p指向的内容不能改变?img src ="http://www.shnenglu.com/geforcex/aggbug/1863.html" width = "1" height = "1" />

halCode 2005-12-18 21:40 发表评论
]]>
ҹƷþþþþþþ| ղƷþþþþþ| Avþ| ޹˾þۺһ77| Ļһþվ| 99þóĻ| þ˽˹ƷvA| ĻþþƷˮ | ¶ۺϼ¾þ| ҹƷþþþþ| þۺ³³| þþþþþþŮ| ޵һAVվþþƷ˵AV | 99reþþƷҳ2020| þݺҹҹ96׽| þþƷУСŮ| Ļþҹ| ɫۺϾþۺۺ| ޹Ʒþþ | þۺϹ׾Ʒ| þݺҹҹվ | þùƷ99Ʒ987| ƷۺϾþþþþ97| þøݾƷԴվ | Ʒþþþþùţţapp| һɫþ88ձȡۺ| 99þþžžƷ| þûƵ| ٸþþþþñŪ߳| þseƷһƷ| Ʒþþþþù| ˾þô߽AVһ | 99þ99þþþƷ| 91Ʒպþò| þۺһ| ˾þô߽| þԭۺ| ƷþþĻһ | һþ㽶߿ۿ | һһþۺϺݺ| þþþ99ƷƬԿ|