??xml version="1.0" encoding="utf-8" standalone="yes"?>
q样p?在重新启?是不是面杉K恢复成默认的啦?/p>
如果q不?那就
rm -rf .gconfd
1、不心误删面板的恢复方?br>
Linux代码 收藏代码
gconftool --recursive-unset /apps/panel
rm -rf ~/.gconf/apps/panel
pkill gnome-panel
2、不心更改默认主题风格的恢复方?br>Linux代码 收藏代码
rm -rf /home/你自q用户目录/.gconf*
sudo reboot now
解决ҎQ?nbsp;
Q?Q用gedit的打开菜单Q在选择文g的同Ӟ可以有选项选择~码Q这样可以保证打开的文件编码正,正确昄文g中的中文Q只Ҏơ有?br>
Q?Q?如果l常使用gbk的编码,那么可以通过l端下面执行gconf-editor,然后选在apps下gedit-2下preferences下的encodings下的auto_detected,双击Q添加gbk~码Q同时gbk~码Ud到utf-8的后面,q个l节也很重要。否则有时候还是会成其他~码。出Cؕ码?
推荐W二U方法,L之选?/p>
此文章的L是希望过于专?NETE序员在做好工作、写?NETE序的同Ӟ能分拨出一Ҏ间接触一?NET之外的东西(例如10%-20%的时_Q而不是鼓动大家什么都d最后什么都学不_,更不是说.NET不行或劝大家攑ּ.NET。恕我愚钝,此主旨在文中表达不够清楚Q看评论中很多朋友误解了Q特此说明?/strong> 另外Q本文中的观点ƈ不全部是我个人的xQ相当一部分来自我以前聊q天的某些大牛,他们很多来自微Y、百度、腾讯等知名企业Qƈ且很多已l成为技术骨qԌ我曾l从他们那里受益匪浅Q于是我把他们的指教l合自n的经验和理解写成此文。这是此文的来源?/strong> ------------------------------------------------------------华丽的分割线------------------------------------------------------------ 在给q篇文章h题的时候,我斟酌了很久Q因为我个h是反对用?NETE序员”、“C++E序员”或“PHPE序员”这cȝ单粗暴的方式为程序员做划分的。但是客观确实存在一个现象,是很多E序员会p|一个无形的界限Q将自己与某U语a或^台硬l定CP例如我这里所指的?NETE序员”。请注意q与“术业有专攻”是不同概念的,有自׃ȝq_或领域这很正常,但是有很多h偏执地将自己与某个语a或^台紧紧捆l,而忘C自己首先是一名程序员Q然后才使用某种语言Q他们偏执于q_q醉于自己建立的盒子里Q而不愿主动去接触一些盒子外的事物,最l得自己无法进步? 从我个h的观点看Q本文中?NETE序员”是指具有如下特点的E序员群体: 如果您有过3符合上q特征,我想我们可以聊一聊,因ؓ据我的观察,感觉博客园上q类朋友q是挺多的? 有一个事实我惛_和大家澄清一下,其实.NET只是我的业余爱好。由于博客园主要偏重?NETq_Q且园子里的朋友寚w向对象、架构之cȝ颇感兴趣Q所以我写了很多关于.NET及架构方面的文章Q如果您注意观察Q会发现我博客里q类文章正减ƈ于消失Q,其实相对于设计、架构这cM西,我个人更感兴的是具体的U学与技术,例如各种~程语言的原理、应用及实现扩展Q操作系l原理,|络~程Q通信协议Q算法与数据l构Q数据挖掘,机器学习Q分布式{等Q语a斚w我比较喜Ƣ的是PHP、Python、Lisp{;而编E方面我更推崇Unix下的~程哲学和编E方法;我爱vim胜过VS无数倍? 因此Q?NET和C#我一直是作ؓ业余爱好来发展的Q希望这没有让Q何h觉得沮。很多朋友加我QQ或MSN问我关于.NET的问题,我经常答不上来,很多人或许觉得我不近人情Q但我其实是真的{不上来。例如我在博客中写过一pd关于ASP.NET MVC的文章,很多人是冲那pd文章加我的,但是其实ASP.NET MVC我只在beta版时摆弄q两个星期,然后再也没有碰q,所以后来很多朋友问我想关问题我是真的答不上来? 所以,在博客园q个?NET和架构之cMؓȝCQ我是半个旁观者吧Q我看到园子里很多朋友都把自q锢在自己创造的盒子里,所以我希望以旁观者的w䆾Q给q些朋友提几个徏议? 有许多h通常觉得只要把一门语a学会学精pQ这个想法我觉得对了一半?strong>一个程序员应该有一门精通的语言Q但是还要不断学习新的语aQ当然不能太频繁Q,倒不是ؓ了以防哪天万一用到q门语言Q而是接触学习不同的语a会拓展程序员的视野?/strong> 如果你一直用C#Q试试LispQ你会惊叹于q有q样写程序的方式Q嗯Q看来我得去学学Lamda演算Q试试PythonQ你会惊讶于q有如此y优美的东西;试试LuaQ你会发现原来语aq能嵌入其它语言Q要不要为WOW写个外挂试试Q试试EiffelQ你会发现还有契U式~程q种ҎQ嗯Q什么?Java上有iContractQ那我要不要?NET实现一个?随着q种学习q程Q你的思维自然p拓展开了,而不是满脑子的Class?Object、MVC、OO…? 其实学习语言不一定是学习没听说过的,许多您听到x长茧却从来没有深入学习的“老朋友?/strong>Q如C、PHPQ如果您l心学下来,也会得到许多意外的收莗? 例如在学C的过E中Q你会发C可能qUnix环境而把C学好Q你会接触POSIX和System VQ你会主动深入学习进E、线E、信受I/O、IPCQ你会接触TCP/IP协议。你会发现要学好Cq要理解计算机组成原理,你还会发现原来还有大端q个东西? 深入学习PHPQ你会发现PHPq不仅仅是一个做Web的脚本语a那么单,你会了解到它SAPI、PHP Compiler和Zend Engine的优结构,你会发现有opcodeQ你会发现PHPn都是扩展点,你可以扩展功能,扩展Compiler和Zend EngineQ甚臛_以完全实现自q~译和运行逻辑。你会了解APC是如何缓存opcodeQAPD是如何跟tPHP的运行? 每次学习一门语aQ你会发现这不是一门语aQ而是一个崭新的新大陆,里面有太多让人兴奋和新奇的东西,而如果你执意锢在?NET盒子”里Q你永q不会知道这些? 如果什么东襉K是用到才学,代码都是有用才写Q那我只能非常抱歉的说你q不是个E序员,而只是个代码工h?/strong>E序员应该有d出击的意识,应该对自己未接触的领域有无限向往。幸q的是,互联|上的胦富实在太多了Q你应该其所能去接触学习未知的东西,而不要L我学习这个东西能不能换来q孩子买尿布和奶粉。你可以有很多借口Q但是我惌Q?strong>借口xL有的Q时间想找也L有的Q还是看自己到底要什么?/strong>不要一边h在盒子里一边又抱怨自己没有进步? 例如Google PublicationQ这里有世界最优秀的Google工程师们理论和实늚ȝQ来读读q些伟大的论文吧Q看看这个伟大的公司和一伟大的人都q了些什么,了解一下Map Reduce是怎么回事Q如果了解了你自然想去试试HadoopQ还有Bigtable和GFSQ哦Q太震撼了,原来存储数据也有q么多讲IӞ不是攄盘里或通过Insert插入数据库就行了。也许这些英文论文读h很困难,但是我想一周一的要求q不高(我现在仍然保持着一周读两篇论文的习惯)。要知道Q最新、最严}的东襉K在论文里Q如果你只是通过书本或社区学习,那么你永q不会知道今天在计算机科学与技术的领域又发生了哪些令h震撼的事情,出现了哪些新奇的东西? 不要太懒惎ͼ你写增删Ҏ写篏了吗QCome onQ有没有惌自己写一个小型的httpdQ当然你需要先d习HTTP协议Q?a >rfc2612Q,试试能不能写一个PHP的SAPI扩展令你的httpd处理PHP脚本。有没有惌自己用lex和yacc实现一个自q语aQ也不是完全没用Q也怽已经对你的领域业务逻辑烂熟于胸Q那么去实现一个自q领域语言吧。啊Q我要去学习~译原理、Ş式语a与自动机……咦Q这东西q挺有意思的Q去看看计算理论厠Z…如果到了这里,你已l开始接触计机的数学本质了Q而你的层ơ将会得到升华? 学习是q样Q主动突破自己,l自׃些挑战性的dQ生zL有趣。成天困?NET的盒子里Q我们还有脸U自׃ؓE序员吗Q? 从没用过IDE的程序员可能是悲剧,但从没脱过IDE的程序员l对是悲剧! 你有没有觉得自己来不像个“编E序”的而越来越像“堆E序”的。好的,即在工作时你离不开IDEQ那么业余时间让你的IDE滚蛋Q等{,你改用NotepadQ气L了你Q试?a >vim?a >EmacsQ体验一下用U文本写E序Q用gcc~译q接的乐。你会发现“yyp”比“选中一行,Ctrl+CQ点M一行v始位|,Ctrl+V”简单的多,你会发现按一下?”比?0ơ“左头”省事的多。等源程序多了,也许你会惛_学习Makefile的写法。你会莫名其妙地发现自己更懂~译和连接过E了? 怿我,用纯文本和shell写程序比用IDE酷多了,惛_引女孩子吗?你去问问你们班或你们公司最漂亮的女生,她也会这么想。重要的是,q种酷不是“装B”的P而是有效率的酗什么?你已l受不了IDE了…? 注意我是用的“接受”而不是用“改变”,你不需要改变什么,?NETE序很好Q不q你可以适当吸取一下其它领域的~程哲学与学习方式?/strong>可以说WindowsQ特别是.NETQ程序员和UnixE序员思考问题的方式大不相同Q如果现在需要一辆汽车,WindowsE序员会建立一个从冉到装配的“All in one”汽车制造基圎ͼ而UnixE序员会d别徏立采矿场、冶铁厂、设计公司、材料制造厂、机械制造厂和装配厂。我不想讨论他们各自的优~点Q因为很Ҏ陷入无谓的宗教纷争)Q但是对于你来说Q了解一些其它的~程哲学对你没有坏处? 另外是学习方式Q例如你要学习PHPQ请千万不要M店购买各U?1天精通PHP》或《PHP~程宝典》,你应该首先打开GoogleQ找?PHP官网Q然后去官方文档哪里L学习资源。网上还有各UwikiQmailing lists和社区,请不要放弃这些资源。然后同时你可以?a >Amazon看书评,然后心而}慎地选择一本相关的书籍Q媄印版最优,译版其ơ)? 一个h想突破自׃ҎQ关键在于自己有没有H破的意ѝ衷心希望有一天,您的脑中不再被ASP.NETQASP.NET MVCQWCFQWPFQADO.NETQSilverlightQEF……而占满,如果C那一天,你会发现Q咦Q!?NET的水q也大幅提升了!
希望我能做到旁观者清
每半q接触ƈ学习一门语a
dH破自己 接受更多挑战
qIDE 玩玩U文本与shell
接受更多的编E哲学与学习方式
]]>
Ҏ一Q递归
int findOneinBin(int n) { if(n<2) return 1; else return n%2+findOneinBin(n/2); }
q个Ҏ很容易想刎ͼ如果是奇数的话就是他的n/2+1Q也是有一位加??.
Ҏ二,google一下找出来的,没看?/p>
#define POW(c) (1<<(c)) #define MASK(c) (((unsigned long)-1) / (POW(POW(c)) + 1)) #define ROUND(n, c) (((n) & MASK(c)) + ((n) >> POW(c) & MASK(c))) int bit_count(unsigned int n) { n = ROUND(n, 0); n = ROUND(n, 1); n = ROUND(n, 2); n = ROUND(n, 3); n = ROUND(n, 4); return n; }
一下子看不明白Q先把宏展开来:
POW是计?的幂
MASK很奇怪,一个全1的无W号数字除以2的幂的幂?Q?br>好在打印出来q能看得懂:
MASK(0) = 55555555 h = 01010101010101010101010101010101 b
MASK(1) = 33333333 h = 00110011001100110011001100110011 b
MASK(2) = 0f0f0f0f h = 00001111000011110000111100001111 b
MASK(3) = 00ff00ff h = 00000000111111110000000011111111 b
MASK(4) = 0000ffff h = 00000000000000001111111111111111 b
q些mask分别?2位数字划分ؓ几个部分。每个部分的前一半和后一半分别是?0'和全'1'?br>MASK(0)分ؓ16个部分,MASK(1)分ؓ8个部分,...
ROUND中对n的处理:(n & MASK) + (n >> POW & MASK)
POW的值刚好是MASK中连l?0'(或者连l?1')的长度。也是说ROUND把由MASK分开的n的各个部分中的高POW位和低POW位相加?br>Z便于说明Q取一个简单的部分QMASK(1)?011
假设n的gؓ1001Q那么ROUND后的l果是10 + 01 = 11 bQ把q个l果赋值给nQ这时n的含义由原来的二q制位串变ؓ'1'位的数量。特别的Q当ROUND(n, 0)Ӟ把n当作一?2个部分各?1'位的数量。('0'表示没有'1'Q?1'则表C有1?1'Q?br>计算完n = ROUND(n, 0)后,n是一?6个部分各?1'位数量的'数组'Q这?数组'的每个元素只?个二q制位。最大gؓ2Q够由2个二q制位来表示?br>接下来,计算完n=ROUND(n,1)后,n是一?个部分各?1'位数量的'数组'Q这?数组'的每个元素只?个二q制位。最大gؓ4Q够由4个二q制位来表示。(实际只需?个二q制位)
...
最后一步,计算n=ROUND(n,4)后,n是一?个部分各?1'位数量的'数组'Q这?数组'的每个元素有32个二q制位。最大gؓ32Q够由32个二q制位来表示。(实际只需?个二q制位)
q个代表32位内'1'位数量的32位二q制C是我们要求的结果?
一
W一最好不相见Q如此便可不相恋?br>W二最好不相知Q如此便可不相思?br>W三最好不怼Q如此便可不相欠?br>W四最好不相惜Q如此便可不相忆?br>W五最好不相爱Q如此便可不相弃?br>W六最好不相对Q如此便可不怼?br>W七最好不相误Q如此便可不相负?br>W八最好不相许Q如此便可不相箋?br>W九最好不怾Q如此便可不相偎?br>W十最好不盔RQ如此便可不相聚?br>但曾相见便相知,相见何如不见时?br>安得与君相诀l,免教生死作相思?/b>
?/strong>
你见Q或者不见我
我就在那?br>不悲不喜
你念Q或者不忉|
情就在那?br>不来不去
你爱Q或者不爱我
爱就在那?br>不增不减
你跟Q或者不跟我
我的手就在你手里
不舍不弃
来我的怀?br>或?br>让我住进你的心里
默然 相爱
寂静 Ƣ喜
?/strong>
住进布达拉宫Q?br>我是雪域最大的王?br>浪在拉萨街_
我是世间最的情郎?
我问佛:Z不给所有女子羞花闭月的定wQ?br>佛曰Q那只是昙花的一玎ͼ用来蒙蔽世俗的眼
我问佛:世间Z有那么多遗憾Q?br>佛曰Q这是一个婆娑世界,婆娑即遗?br>我问佛:如何让h们的心不再感到孤单?
佛曰Q每一颗心生来是孤单而残~的
我问佛:如果遇到了可以爱的hQ却又怕不能把握该怎么办?
佛曰Q留人间多少爱,qQ世千重变
我问佛:如何才能如你般睿智?
佛曰Q佛是过来hQh是未来佛
我问佛:Z么L在我悲伤的时候下?br>佛说Q冬天就要过去,留点记忆
我问?Z么每ơ下雪都是我不在意的夜晚
佛说:不经意的时候h们M错过很多真正的美?br>我问?那过几天q下不下?br>佛说:不要只盯着q个季节Q错q了今冬
l构体还是有很多的区别?/p>
1.cL员默认访问权限ؓU有QprivateQ,l构体成员默认访问权限ؓ公共QpublicQ;
2.从classl承默认是privatel承Q而从structl承默认是publicl承?/p>
注意QC中的struct跟C++中struct可是不一L
*q?构造数据类?也叫联合?
用途:使几个不同类型的变量共占一D内?怺覆盖)
l构体是一U构造数据类?
用途:把不同类型的数据l合成一个整?------自定义数据类?
---------------------------------------------------------------
l构体变量所占内存长度是各成员占的内存长度的d?
共同体变量所占内存长度是各最长的成员占的内存长度?
共同体每ơ只能存攑֓个的一U!Q?
共同体变量中起作用的成员是尊后一ơ存攄成员Q?
在存入新的成员后原有的成员失M作用Q?
---------------------------------------------------------------
struct ?union主要有以下区?
1. struct和union都是由多个不同的数据cd成员l成, 但在M同一时刻, union中只存放了一个被选中的成? 而struct的所有成员都存在。在struct中,各成员都占有自己的内存空_它们是同时存在的。一个struct变量的总长度等于所有成员长度之和。在Union中,所有成员不能同时占用它的内存空_它们不能同时存在。Union变量的长度等于最长的成员的长度?
2. 对于union的不同成员赋? 会对其它成员重? 原来成员的值就不存在了, 而对于struct的不同成员赋值是互不影响的?
引用Q就是变量或对象的别名,它不是|不占存储I间Q其只有声明没有定义Q其主要用于函数的Ş参和函数的返回倹{?/p>
注意Q引用作为函数的q回|大多数情况下可以被指针代替,但是遇到构造函数和操作W重载函数的“Ş式自然”的问题是,是不能被替代的?/p>
引用和指针区别:
内存区域 | 说明 |
栈区QstackQ?/font> | q译器自动分配释放Q存放ؓq行函数而分配的局部变量、函数参数、返回数据、返回地址{。其操作方式cM于数据结构中的栈?/font> |
堆区QheapQ?/font> | 一般有E序员分配释放,若程序员不释放,E序l束时可能有pȝ回收。分配方式类g链表?/font> |
全局区(staticQ?/font> | 存放全局变量、静态数据、常量。程序结束后有系l释放?/font> |
文字帔R?/font> | 帔R字符串就是放在这里;E序l束后有pȝ释放?/font> |
E序代码?/font> | 存放函数体(cL员函数和全局函数Q的二进制代码?/font> |
实例分析Q?/font>
int a=0; //全局区初始化? char *p1; //全局区未初始化区 static char b; //全局区未初始化静态变? int main() { int c; //栈区临时变量 char s[]="abc"; //栈区临时数组变量 char *p2; //栈区临时指针变量 char *p3="123"; //帔R区常量,栈区指针变量 static int d=0; //全局初始化区静态变? p1=new char[10]; //堆区分配10个字W空? p2=new char[20]; //堆区分配20个字W空? strcpy(p1,"123"); //"123"攑֜帔R区,~译器有可能它与p3所指向的区域相?/span>
}
内存分配方式Q?/font>
堆和栈究区别Q?/font>
主要的区别由以下几点Q?br> 1.理方式Q对于栈来讲Q是q译器自动理Q无需我们手工控制Q对于堆来说Q释攑ַ作由E序员控ӞҎ产生memory leak?br>
2.I间大小Q一般来讲在32位系l下Q堆内存可以辑ֈ4G的空_从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲Q一般都是有一定的I间大小 的,例如Q在VC6下面Q默认的栈空间大是1MQ好像是Q记不清楚了Q。当Ӟ我们可以修改Q?br>打开工程Q依ơ操作菜单如下:Project->Setting->LinkQ在Category 中选中OutputQ然后在Reserve中设定堆栈的最大值和commit?br> 注意Qreserve最gؓ4ByteQcommit是保留在虚拟内存的页文g里面Q它讄的较大会使栈开辟较大的|可能增加内存的开销和启动时间?br>
3.片问题Q对于堆来讲Q频J的new/delete势必会造成内存I间的不q箋Q从而造成大量的碎片,使程序效率降低。对于栈来讲Q则不会存在q个问题Q?因ؓ栈是先进后出的队列,他们是如此的一一对应Q以至于永远都不可能有一个内存块从栈中间弹出Q在他弹Z前,在他上面的后q的栈内容已l被弹出Q详l的 可以参考数据结构,q里我们׃再一一讨论了?br>
4.生长方向Q对于堆来讲Q生长方向是向上的,也就是向着内存地址增加的方向;对于栈来Ԍ它的生长方向是向下的Q是向着内存地址减小的方向增ѝ?br>分配方式Q堆都是动态分配的Q没有静态分配的堆。栈?U分配方式:静态分配和动态分配。静态分配是~译器完成的Q比如局部变量的分配。动态分配由 alloca函数q行分配Q但是栈的动态分配和堆是不同的,他的动态分配是q译器q行释放Q无需我们手工实现?br>
5.分配效率Q栈是机器系l提供的数据l构Q计机会在底层Ҏ提供支持Q分配专门的寄存器存放栈的地址Q压栈出栈都有专门的指o执行Q这决定了栈的效率?较高。堆则是C/C++函数库提供的Q它的机制是很复杂的Q例如ؓ了分配一块内存,库函C按照一定的法Q具体的法可以参考数据结?操作pȝQ在堆内存中搜烦可用的够大的I间Q如果没有够大的I间Q可能是׃内存片太多Q,有可能调用pȝ功能d加程序数据段的内存空_q样有Z?到够大的内存Q然后进行返回。显Ӟ堆的效率比栈要低得多?/font>
常见的内存错误及其对{:
发生内存错误是g非常ȝ的事情。编译器不能自动发现q些错误Q通常是在E序q行时才能捕捉到。而这些错误大多没有明昄症状Q时隐时玎ͼ增加了改错的隑ֺ。常见的内存错误及其对策如下Q?
* 内存分配未成功,却用了它?/font>
~程新手常犯q种错误Q因Z们没有意识到内存分配会不成功。常用解军_法是Q在使用内存之前查指针是否ؓNULL。如果指针p是函数的参数Q那么在函数的入口处用assert(p!=NULL)q行查。如果是用malloc或new来申请内存,应该用if(p==NULL) 或if(p!=NULL)q行防错处理?
* 内存分配虽然成功Q但是尚未初始化引用它?/font>
犯这U错误主要有两个起因Q一是没有初始化的观念;二是误以为内存的~省初值全为零Q导致引用初值错误(例如数组Q?内存的缺省初值究竟是什么ƈ没有l一的标准,管有些时候ؓ零|我们宁可信其无不可信其有。所以无论用何种方式创徏数组Q都别忘了赋初|即便是赋零g不可省略Q不要嫌ȝ?
* 内存分配成功q且已经初始化,但操作越q了内存的边界?/font>
例如在用数l时l常发生下标“多1”或者“少1”的操作。特别是在for循环语句中,循环ơ数很容易搞错,D数组操作界?
* 忘记了释攑ֆ存,造成内存泄露?/font>
含有q种错误的函数每被调用一ơ就丢失一块内存。刚开始时pȝ的内存充I你看不到错误。终有一ơ程序突然死掉,pȝ出现提示Q内存耗尽?
动态内存的甌与释攑ֿ配对,E序中malloc与free的用次C定要相同Q否则肯定有错误Qnew/delete同理Q?
* 释放了内存却l箋使用它?/font>
有三U情况:
Q?Q程序中的对象调用关p过于复杂,实在难以搞清楚某个对象究竟是否已l释放了内存Q此时应该重新设计数据结构,从根本上解决对象理的乱局面?
Q?Q函数的return语句写错了,注意不要q回指向“栈内存”的“指针”或者“引用”,因ؓ该内存在函数体结束时被自动销毁?
Q?Q用free或delete释放了内存后Q没有将指针讄为NULL。导致生“野指针”?
【规?】用malloc或new甌内存之后Q应该立x查指针值是否ؓNULL。防止用指针gؓNULL的内存?
【规?】不要忘Cؓ数组和动态内存赋初倹{防止将未被初始化的内存作ؓ叛_g用?
【规?】避免数l或指针的下标越界,特别要当心发生“多1”或者“少1”操作?
【规?】动态内存的甌与释攑ֿ配对,防止内存泄漏?
【规?】用free或delete释放了内存之后,立即指针设|ؓNULLQ防止生“野指针”?
来自Q百度百U?
函数指针是指向函数的指针变量?因而“函数指针”本w首先应?a >指针变量Q只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字W型?a >数组一Pq里是指向函数。如前所qͼC在编译时Q每一个函数都有一个入口地址Q该入口地址是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函敎ͼ如同用指针变量可引用其他类型变量一P在这些概念上是一致的。函数指针有两个用途:调用函数和做函数?a >参数?
1. 函数指针声明ҎQ?/font>
【数据类型】?】【指针变量名】(形参列表Q;
?Q“函数类型”说明函数的q回cdQ由于?)”的优先U高于??所以指针变量名外的括号必不可少Q后面的“Ş参列表”表C指针变量指向的函数所带的参数列表。例如:
int func(int x); /* 声明一个函?*/
int (*f) (int x); /* 声明一个函数指?*/
f=func; /* func函数的首地址赋给指针f */
赋值时函数func不带括号Q也不带参数Q由于func代表函数的首地址Q因此经q赋g后,指针f指向函数func(x)的代码的首地址?
?Q函数括号中的Ş参可有可无,视情况而定?
下面的程序说明了函数指针调用函数的方法:
#include <iostream> using namespace std; int max(int x,int y){return (x>y?x:y);} int main() { int (*ptr)(int,int ); int a,b,c; ptr=max; cin>>a>>b; c=(*ptr)(a,b); cout<<c<<endl; return 0; }
ptr是指向函数的指针变量Q所以可把函数max()赋给ptr作ؓptr的|xmax()的入口地址赋给ptr,以后可以用ptr来调用该函数Q实际上ptr和max都指向同一个入口地址Q不同就是ptr是一个指针变量,不像函数名称那样是死的,它可以指向Q何函敎ͼq你想怎么做了。在E序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它Q因此可以先后指向不同的函数?b>不过注意Q指向函数的指针变量没有++?-q算Q用时要心?
2.指针函数和函数指针的区别Q?/font>
1,q两个概念都是简Uͼ指针函数是指带指针的函数Q即本质是一个函数。我们知道函数都又有q回cdQ如果不q回?/a>Q则为无值型Q,只不q指针函数返回类型是某一cd的指针?
其定义格式如下所C:
【返回类?a >标识W?/a>】?*】【返回名U】(形式参数表)
Ҏ分析Q首先说明是一个数l:数组名[]
其次Q要说明其元素的数据cd指针:*数组名[].
再次Q要明确q每一个数l元素是指向函数入口地址的指针:函数q回值类?(*数组名[])().h意,q里Z么要把?数组名[]”用括号扩v来呢Q因为圆括号和数l说明符的优先是等同的Q如果不用圆括号把指针数l说?a >表达?/a>扩v来,Ҏ圆括号和ҎLl合方向Q那?*数组名[]() 说明的是什么呢Q是元素q回值类型ؓ指针的函数数l。有q样的函数数吗Q不知道。所以必LhQ以保证数组的每一个元素是指针?
W二U,蒙骗法:
管函数不是变量Q但它在内存中仍有其物理地址Q该地址能够赋给指针变量。获取函数地址的方法是Q用不带有括号和参数的函数名得到?
函数名相当于一个指向其函数入口指针帔R?那么既然函数名是一个指针常量,那么可以对其进行一些相应的处理Q如强制cd转换?
那么我们可以把q个地址攑֜一个整形指针数l中Q然后作为函数指针调用即可?
完整例子Q?#include <iostream>
int add1(int a1,int b1);
int add2(int a2,int b2);
int main()
{
int numa1=1,numb1=2;
int numa2=2,numb2=3;
int (*op[2])(int a,int b);
op[0]=add1;
op[1]=add2;
printf("%d ,%d\n",op[0](numa1,numb1),op[1](numa2,numb2));
system("PAUSE");
return 0;
}
int add1(int a1,int b1)
{
return a1+b1;
}
int add2(int a2,int b2)
{
return a2+b2;
}
]]>
#include<iostream> using namespace std; int main() { char str1[]="abc"; char str2[]="abc"; const char str3[]="abc"; const char str4[]="abc"; const char *str5="abc"; const char *str6="abc"; char *str7="abc"; char *str8="abc"; cout<<(str1==str2)<<endl; cout<<(str3==str4)<<endl; cout<<(str5==str6)<<endl; cout<<(str7==str8)<<endl; getchar(); }
l果是:
为神马呢Q?/p>
写个代码来看看内存地址Q?/p>
#include<iostream> using namespace std; int main() { char str1[]="abc"; char str2[]="abc"; const char str3[]="abc"; const char str4[]="abc"; const char *str5="abc"; const char *str6="abc"; char *str7="abc"; char *str8="abc"; printf("abc: %d\n",&("abc")); printf("str1: %d\n",str1); printf("str2: %d\n",str2); printf("str3: %d\n",str3); printf("str4: %d\n",str4); printf("str5: %d\n",str5); printf("str6: %d\n",str6); printf("str7: %d\n",str7); printf("str8: %d\n",str8); getchar(); return 0; }
l果是:
分析Q?/p>
str1Qstr2Qstr3Qstr4是数l变量,它们有各自的I间Q而数l名是数组的首地址?/p>
str5Qstr6Qstr7Qstr8是指针,它们指向了相同的帔R区域?/p>