我们通常开启keep-alive,这种模式,即使apache的服务进程/线程已经和client完成了IO通信,也仍然无法处理新的请求,因为连接未被断开。event就是为了解决这种场景下的,IO空等。
思路类似于协程

apache的一个线程处理完之后,要给客户端回复10K内容,处理过程是下面哪一种情况:
1、apache线程将10K内容丢给底层,apache线程立即空闲出来可以处理下一个请求,底层将10k内容发给客户端
2、apache线程等客户端接收完10K内容后才空闲


应该是1,底层buffer也有大小限制,10k全部写到内核的buffer中,线程会再次进行系统调用select(假设工作在select模式下),获取下一个ready的文件描述符
如果按写文件来理解发送网络内容,感觉是2,文件内容写完了线程才能空闲出来

will说的写到buffer的可能性比较大

Apache的prefork模式,也就是多进程模式,是完整处理完一个用户请求后,才能处理下一个请求。
worker模式,同上,只是处理的者从进程变为线程。(线程比进程轻量,占据更少内存空间等)
event模式(比较新版本的Apache才完整支持),可以做到遇到IO等待的时,执行其新的请求。
http://hansionxu.blog.163.com/blog/static/2416981092014112933930779/

__________________________________________________
prefork和worker模式的比较
prefork模式使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。在大多数平台上,Prefork MPM在效率上要比Worker MPM要高,但是内存使用大得多。prefork的无线程设计在某些情况下将比worker更有优势:它可以使用那些没有处理好线程安全的第三方模块,并且对于那些线程调试困难的平台而言,它也更容易调试一些。

worker模式使用多个子进程,每个子进程有多个线程。每个线程在某个确定的时间只能维持一个连接。通常来说,在一个高流量的HTTP服务器上,Worker MPM是个比较好的选择,因为Worker MPM的内存使用比Prefork MPM要低得多。但worker MPM也由不完善的地方,如果一个线程崩溃,整个进程就会连同其所有线程一起”死掉”.由于线程共享内存空间,所以一个程序在运行时必须被系统识别为”每个线程都是安全的”。

总的来说,prefork方式速度要稍高于worker,然而它需要的cpu和memory资源也稍多于woker。

1、prefork.c模块(一个非线程型的、预派生的MPM)
    prefork MPM 使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。在大多数平台上,Prefork MPM在效率上要比Worker MPM要高,但是内存使用大得多。prefork的无线程设计在某些情况下将比worker更有优势:他能够使用那些没有处理好线程安全的第三方模块,并且对于那些线程调试困难的平台而言,他也更容易调试一些。阅读全文
PHP运行超时 不修改php.ini的情况下,如果没有set_time_limit(0),那么下面这段程序将很快报超时错误,加了之后可以耐心等待运行结束了

=======================================================================

在运行一个较长脚本的时候遇到超时的问题了,所以查了下,在php.ini中设置下就可以了
搜索max_execution_time = 30 ; 每个脚本的最大执行时间, 按秒计的
个人认为改成60秒已经很高了!

可用程序修改:set_time_limit (0);


=================================================

语法 : void set_time_limit (int seconds)
说明 :
    设定一个程式所允许执行的秒数,如果到达限制的时间,程式将会传回错误。它预设的限制时间是30秒,max_execution_time的值定义在结构档案中(在PHP3中叫做php3.ini,在PHP4则叫做php.ini),如果将秒数设为0,表示无时间上的限制。
    当呼叫此函式时,set_time_limit( )会从零重新开始计算最长执行的时间,也就是说,如果最长执行时间为预设的30秒,而在呼叫此函式set_time_limit(20)之前已花了25秒来执行程式,则程式最长执行的时间将会是45秒。
    注意 : 当PHP是执行在安全模式时,set_time_limit( )将不会有结果,除非是关闭安全模式或是修改结构档案中(在PHP3中叫做php3.ini,在PHP4则叫做php.ini)的时间限制。
例 :
set_time_limit(1000)
      create TABLE myIndex ( i_testID INT NOT NULL AUTO_INCREMENT, vc_Name VARCHAR(50) NOT NULL, vc_City VARCHAR(50) NOT NULL, i_Age INT NOT NULL, i_SchoolID INT NOT NULL, PRIMARY KEY (i_testID) );

    在这10000条记录里面7上8下地分布了5条vc_Name="erquan"的记录,只不过city,age,school的组合各不相同。
  来看这条T-SQL:
    select i_testID FROM myIndex where vc_Name='erquan' AND vc_City='郑州' AND i_Age=25;

    首先考虑建单列索引:
     在vc_Name列上建立了索引。执行T-SQL时,MYSQL很快将目标锁定在了vc_Name=erquan的5条记录上,取出来放到一中间结果集。在这个结果集里,先排除掉vc_City不等于"郑州"的记录,再排除i_Age不等于25的记录,最后筛选出唯一的符合条件的记录。

    虽然在vc_Name上建立了索引,查询时MYSQL不用扫描整张表,效率有所提高,但离我们的要求还有一定的距离。同样的,在vc_City和i_Age分别建立的单列索引的效率相似。
    为了进一步榨取MySQL的效率,就要考虑建立组合索引。就是将vc_Name,vc_City,i_Age建到一个索引里:
    alter TABLE myIndex ADD INDEX name_city_age (vc_Name(10),vc_City,i_Age);--注意了,建表时,vc_Name长度为50,这里为什么用10呢?因为一般情况下名字的长度不会超过10,这样会加速索引查询速度,还会减少索引文件的大小,提高insert的更新速度。

    执行T-SQL时,MySQL无须扫描任何记录就到找到唯一的记录!!

     肯定有人要问了,如果分别在vc_Name,vc_City,i_Age上建立单列索引,让该表有3个单列索引,查询时和上述的组合索引效率一样吧?嘿嘿,大不一样,远远低于我们的组合索引~~虽然此时有了三个索引,但MySQL只能用到其中的那个它认为似乎是最有效率的单列索引。

    建立这样的组合索引,其实是相当于分别建立了
        vc_Name,vc_City,i_Age
        vc_Name,vc_City
        vc_Name
    这样的三个组合索引!为什么没有vc_City,i_Age等这样的组合索引呢?这是因为mysql组合索引"最左前缀"的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引,下面的几个T-SQL会用到:
    select * FROM myIndex WHREE vc_Name="erquan" AND vc_City="郑州"
    select * FROM myIndex WHREE vc_Name="erquan"
而下面几个则不会用到:
    select * FROM myIndex WHREE i_Age=20 AND vc_City="郑州"
    select * FROM myIndex WHREE vc_City="郑州"
 一个剑客要想修炼成为可御剑飞升的剑仙,就要提高自身素质和用剑的本领,开发人员也是一样,我们的\"剑\"就是技术。那么要在哪些方面下功夫呢?
阅读全文
走过的路,回忆起来是那么曲折,把自己的一些心得体会分享给程序员兄弟姐妹们,虽然时代在变化,但是很可能你也会走我已经做过的10年的路程,有些心得体会你可以借鉴一下,觉得说得有道理的你就接纳,觉得说得没道理的,你就抛弃,以下是我发自内心的,给大家的忠告,特别是针对那些小弟弟妹妹们。阅读全文
看老外在做PHP的comet的时候往往在做推送数据的时候呢,往往就是进入while(1)里面循环发送,然后sleep(1)一下,往往不能再和外面的程序推送数据给它而后很难实现客户端的访问给予提交相关的数据进而推出需要返回的数据,由于是长连接,这个php.ext一直不能退出,我刚刚突然想到了通过共享内存来实现,php.exe永不退出,而php2.exe去修改php.exe的共享内存内容,进而在php.exe里面还没有退出就得到了新的内容不断吐数据给浏览器端,这样就扩展了php的应用范围,可以实现真正的推送数据了,呵呵!        
这仅仅是我自己的一个想法。【向东】其实socket也是可以写在while(1) 里面从别的程序拿到数据的,PHP4好像对socket的支持不是很好,PHP5不知如何??。
参考:PHP下利用共享内存处理session的代码                         http://blog.jackxiang.com/post/1853/
                             PHP进程间通讯之共享内存:                 http://blog.jackxiang.com/post/1852/
参考:http://www.zeitoun.net/articles/comet_and_php/start
一、基于AJAX轮询方式与传统AJAX方式的区别:

    1. 服务器端会阻塞请求直到有数据传递或超时才返回。
    2. 客户端 JavaScript 响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建立连接。
    3. 当客户端处理接收的数据、重新建立连接时,服务器端可能有新的数据到达;这些信息会被服务器端保存直到客户端重新建立连接,客户端会一次把当前服务器端所有的信息取回。

    采用这种方式实现的技术有meboo和pushlet chat。

二、基于iframe及htmlfile流的方式

    这个方式和AJAX方式原理相同,只是浏览器一直会显示正在连接状态,gtalk采用htmlfile技术解决了此问题。Zeitoun 网站提供的 comet-iframe.tar.gz,封装了一个基于 iframe 和 htmlfile 的 JavaScript comet 对象,支持 IE、Mozilla Firefox 浏览器,可以作为参考:http://www.zeitoun.net/articles/comet_and_php/start

三、Http长连接的编程原则

    1、不要在同一个客户端开启超过两个的http长连接,这个是受http协议限制的。
    2、控制信息和数据信息使用不同的http连接。
    3、在客户端和服务器端保持“心跳”信息。

四、Pushlet框架学习

    Pushlet框架是用后台采用java实现,前台技术有AJAX和Iframe两种。设计思想采用观察者模式。


点击在新窗口中浏览此图片
所谓Push Mail,全称应该是Server Push Email。顾名思义,即邮件到达服务器后,由服务器主动将邮件推送到用户的接收终端上(比如手机)。而像我们使用的Outlook等邮件客户端的收取邮件行为,是典型的Client Pull Mail模式,即客户端主动收取邮件,这实际上是需要用户干预操作的。如此一来,Push Mail的优势就不言而喻了——它不需要用户进行任何干涉,可以由服务器自动将邮件推送到用户手机,简单来说就是方便。
和一以前毕业实习的公司现在在雅虎的同事聊天:
回忆未来  11:29:11
你们做的啥,给个链接让我瞧瞧。
扬东  11:29:14
好好干,
回忆未来  11:29:28
给个链接让我瞧瞧
扬东  11:29:34
http://bbs.koubei.com/
http://ask.koubei.com/
扬东  11:29:43
这两个现在都我一个人。
回忆未来  11:30:13
上司是个大色狼我该怎么办? 呵呵,就搞这些玩意,唉,不过我喜欢。
回忆未来  11:30:29
很厉害喔你,呵呵呵
回忆未来  11:33:30
雅虎没你不行了喔,呵呵。
扬东  11:33:46
呵呵,
回忆未来  11:33:57
我没事来瞅瞅,给你加人气哈。
扬东  11:34:14
好,
回忆未来  11:34:15
里面的东西还真吸引我,以前咋就没有注意呢?哈哈
扬东  11:34:22
呵呵,

Atmel公司的AVR系列单片机是一种性能优良, 耗电很小的微控制器, 他的主要特点是:
1). 单时钟周期指令;
2). 很高的C语言编码效率;
3). 支持在系统编程(ISP)技术.
AVR单片机是我目前在Linux下看到的开发工具最全的微控制器, 它的开发非常方便, 从此我们在Linux下也可以开发单片机了.
开发AVR的编译器是gcc, 实际上就是给gcc加上适合于AVR的库, 该库的名字叫avr-libc, 目前支持的开发语言是c和c++, c++的支持还在开发中. 下面就介绍AVR-GCC的安装方法并简单介绍一下通用编程器uisp的安装方法.
当前avr-libc仍在不断的进行中, 该项目的主页是 http://www.nongnu.org/avr-libc , 该页面上面还有很多AVR在Linux下开发的辅助工具, 本文就不介绍了. avr-gcc的下载地址是: http://savannah.nongnu.org/download/avr-libc/snapshots/src , 请下载binutils-030428.tar.bz2 , gcc-core-20030428.tar.bz2 , gcc-g++-20030428.tar.bz2 , avr-libc-20030422cvs.tar.gz. 以root用户登录, 将它们拷贝到安装目录中(我的习惯是/usr/local/src), 解压缩软件包:
bunzip2 *.bz2
tar xvf *.tar
tar zxvf *.tar.gz
之后会在安装目录中生成`三个子目录, binutils-030438/ , gcc-20030428/ , avr-libc-20030422cvs/ . 下面分别安装之.
安装binutils:
cd binutils-030428/
./configure --target=avr --prefix=/usr/local/atmel (/usr/local/atmel是安装目录)
make
make install
然后在/etc/ld.so.conf中加入/usr/local/atmel/lib一行, 并运行/sbin/ldconfig更新.
在~/.bashrc文件中加入export PATH=/usr/local/atmel/bin:${PATH}, 并且在命令行下也输入该语句.
安装gcc:
cd gcc-20030428/
./configure --target=avr --prefix=/usr/local/atmel --disable-nls --enable-language=c,c++
make
make install
安装avr-libc:
先设置一些环境变量:
export CC=avr-gcc; export AS=avr-as; export AR=avr-ar; export RANLIB=avr-ranlib
export PATH=/usr/local/atmel/bin:${PATH}; export PREFIX=/usr/local/atmel
./reconf
./doconf
./domake
cd build
make install
如果一切顺利的话, AVR-GCC就安装完成了.
下面介绍通用编程器uisp的安装
uisp是一个通用的编程器, 用来在Linux下控制各种各样的编程器, 该项目正在不断的完善中, 项目的主页是:
http://savannah.nongnu.org/projects/uisp
从上面下载uisp-20021201.tar.gz
解压缩:
tar zxvf uisp-20021201.tar.gz
开始安装:
cd uisp-20021201/
./configure
make
make install
这样uisp也装好了. 运行之前我们还要作些准备工作. 运行lsmod命令, 看列表中有没有parport, parport_pc, ppdev 三个模块, 有的话就跳过下面一段.
编译内核, 确信选中parallel port support -> parallel support 和 parallel port support -> pc-style hardware 及 Character devices -> Support for user-space parallel port device drivers 三项. 编译好内核后, 进入/lib/modules/<内核版本号>/kernel/drivers/parport/ , 运行 insmod parport.o ; insmod parport_pc.o ; cd .. ; cd char/ ; insmod ppdev.o , 可以将加载模块的命令加入rc.sysinit, 这样就不用以后再手工输入了.
下面简单讲讲avr-gcc和uisp的使用方法, 详细的handbook我会以后翻译. 假定mcu为at90s8515, 源程序为avr.c .
1). 编译C源程序
生成.o文件: avr-gcc -mmcu=at90s8515 -Os avr.c
生成.out文件: avr-gcc -mmcu=at90s8515 -o -Wl,-Map,avr.map avr.o avr.out
生成.hex文件: avr-objcopy -R .eeprom -O ihex avr.out avr.hex
2). 在线下载
刷新: uisp -dlpt=/dev/parport0 --erase -dprog=dapa
编程: uisp -dlpt=/dev/parport0 --upload if=avr.hex -dprog=dapa -dno-poll -v=3 --hash=32
3). 下载线
PC 并口 AVR
Init (Pin 16) -> Reset
D0 (Pin 2) -> MOSI
Busy(Pin 11) -> MISO
Strobe(Pin 1) -> SCK
GND(Pin 18) -> GND
注意:
引线要串1K的电阻, AVR的Reset端接10K的上拉, 要给单片机3-5V的外部供电.
最后祝大家都能顺利的使用Linux开发AVR.
有问题与我联系 (cuijianw@etang.com)


问:
答:软件包?首先你用什么linux?一般性的ubuntu之类的,都可以直接用avr-gcc来搞~avr-gcc,如果是debian或者ubuntu可以直接apt-get
阅读全文
原来想的是用一个对列来调用一个播放器进行温度报警和系统的状态检查啥的,最后没有想到还是得用Mplayer的播放列表来做,于是就涉及到把某个$HOME/music下的歌,都制作成一个播放列表,怎么做?还有就是一旦我有了播放列表,怎么随意添加 或删除其中的一些歌?

$ ls $HOME/music > music.lst
添加
echo music.mp3 >> music.lst
删除
用编译器打开music.lst删除你想删除的
播放
$ mplayer -playlist music.lst #也有可能是mplayer --playlist music.lst,记不清啦,自己看一下mplayer --help
有了这样一个基础,那么就可以通过程序去自动构造播放列表了!!!
附加信息:
linux 下mplayer播放列表制作的一个方法

   在终端如果输入 mplayer xxx.mp3 就会播放了,输入 mplayer /.../* 就可以播放这个路径下的所有支持的多媒体文件了,为了省去每次都输入绝对路径的麻烦,可以制作mplayer的播放列表,以后只要播放这个列表就可以了。假设自己的多媒体文件放在路径 /mnt/dpan/music/ ,将制作好的播放列表放在路径 ~/music/ ,制作方法如下:

          1.   #echo /mnt/dpan/music/* ~/music/xxx.lst        回车,xxx是你要创建的列表的文件名;

        2.   打开xxx.lst ,对其编辑,可以看到里面的曲目信息没有换行,用鼠标点在每个空各处,回车,使每个曲目占一行,这一步的编辑不能少,否则这个列表是不能播放的。

        3.   这样一个列表就制作好了,输入#mplayer -playlist ~/music/xxx.lst ,就可以播放列表中的所有音乐了,通过 pageup 和pagedown 来选择歌曲,通过上,下,左,右方向键可以调节歌曲的进度。

        注:你也可以将某一个歌曲文件添加到播放列表中,方法一样,只须将 上面的所有文件换成某个具体的文件。 本方法是在 http://hi.baidu.com/pxrchen/blog/item/2998d1516654e92542a75b9e%2Ehtml 的基础上改进而来的。

安装方法:
tar jxvf MPlayer-1.0rc2.tar.bz2
./configure--prefix=/usr/local/mplayer
cd MPlayer-1.0rc2
make;makeinstall;
/usr/local/mplayer/bin/mplayer
/usr/local/mplayer/bin/mplayer:errorwhileloadingsharedlibraries:libiconv.so.2:cannotopensharedobjectfile:Nosuchfileordirectory
whereis libiconv.so.2
libiconv.so:/usr/local/lib/libiconv.so.2/usr/local/lib/libiconv.so

ln-s/usr/local/lib/libiconv.so.2/usr/lib

/usr/local/mplayer/bin/mplayer

MPlayer1.0rc2-4.1.2(C)2000-2007MPlayerTeam
CPU:Intel(R)Pentium(R)Mprocessor1.70GHz(Family:6,Model:13,Stepping:6)

列表做法:
$ ls $HOME/music/*.mp3 > music.lst
[root@localhost Mplayer]# vi music.lst
1.mp3
2.mp3
3.mp3
mplayer -playlist music.lst
即可!
Mplayer正在运行,你再运行一个播放列表。
[root@localhost Mplayer]# ps aux|grep mpl
root      8866  4.0  0.2  24588  3908 pts/1    S+   19:57   0:04 mplayer -playlist music.lst
root      8875  0.0  0.0   5016   692 pts/3    R+   19:59   0:00 grep mpl

出现错误:
[root@localhost Mplayer]# mplayer ~/Mplayer/music.lst
MPlayer 1.0rc2-4.1.2 (C) 2000-2007 MPlayer Team
CPU: Intel(R) Pentium(R) M processor 1.70GHz (Family: 6, Model: 13, Stepping: 6)
CPUflags:  MMX: 1 MMX2: 1 3DNow: 0 3DNow2: 0 SSE: 1 SSE2: 1
Compiled for x86 CPU with extensions: MMX MMX2 SSE SSE2

Playing /root/Mplayer/music.lst.
Win32 LoadLibrary failed to load: avisynth.dll, /usr/local/mplayer/lib/codecs/avisynth.dll, /usr/lib/win32/avisynth.dll, /usr/local/lib/win32/avisynth.dll

这样也就只能一次播放一个列表,直到这个播放完毕再播放下一个列表。
如果你想在它播放music.lst的时候进行echo "1.mp3" >> music.lst来插入的话,最后它还是不会播放你插入的那个Mp3,估记在它调入的时已经把那个文件给读取到内存了。特别注意!

来源:http://blog.csdn.net/wushuan10141/archive/2008/07/31/2747790.aspx
摘  要

    本文主要论述了嵌入式浏览器开发所涉及到的技术,对HTML词法分析、浏览器JavaScript支持、linux和gtk编程等做了详细的分析和介绍,并对Netbit浏览器的开发进行了介绍,分析了主要的模块的功能和组成,并给出了主要算法。

还对典型的嵌入式浏览器进行了分析,包括Gzilla,Mozilla,Thunder和zen,总结了浏览器设计的技术要点和开发策略。

另外,在论文开头,介绍了目前嵌入式浏览器产品的发展现状,嵌入式浏览器的组成和各部份功能说明。

    HTML词法分析是着重讨论的技术问题,给出了详尽的数据结构,程序流程。

    Netbit浏览器的开发,是本论文的重点,分模块进行了分析,提出了需要改进的地方,并给出了改进措施。

关键词:嵌入式浏览器,HTML词法分析,Javascript,linux,gtk

阅读全文

   作为过来人思前想后,我感到完全有责任将发自心底的感受传递给年轻一代,“一个企业家心灵深处渴望优秀人才的卓越追求和深层次的叹息、痛苦和感受”。您们千万不要等到毕业求职时才觉得自己能力太差,世界上从来就没有后悔药。当然,如果您现在看了我写的这篇文章可能还不算晚,因为您还有机会在以后的岁月里奋起直追——“亡羊补牢,尤未为晚”。对于现在刚进入大学的学生,您应该更加珍惜这美好的求学机会,因为眨眼之间几年就过去了,您很快就会感到来自全社会生存竞争的压力,您面临的对手再也不仅仅是您身边的同学,今天您在班上的成绩的确是前几名,但一走到社会上去才感到是多么地脆弱而又多么地不堪一击。阅读全文
致阅读本书的大学生朋友阅读全文
针的指针老是给人讲懂了又忘记,忘记了又讲懂了,但是就像是一个橡皮擦一样一直没有真懂,于是还得复习一下。
1.记住两点:
(1)什么样的类型决定去指向什么样的内容,*一般表示取这个变量指向(可能是指针或者首地址)的内容,如:整形的指针指向整形的内容
(2)任何变量都有地址,变量名指向它的内容(指针的内容是地址或者非指针类型内容可能是char int等),取地址一般得加&,可以通过%p打印出来,而指针特殊在他本身内容是地址,为此,打印%p的时候呢,如没有加&是打印的指针的内容(存的地址),而按照区地址一般加&的原则来打印指针的时候呢,打印的是指针的地址而不是其内容地址。
实践:


point.c
#include
int main()
{
        int a=8;
        int *p;
        int *p2;
        printf("%p\n",&a);
        p=&a;
        printf("%p\n",p);
        printf("%p\n",*p);
        p2 = p;
        printf("%p\n",p2);
        printf("%p\n",p2);
        printf("p=%p\n",&p);
        printf("p2=%p\n",&p2);

        printf("%d\n",*p2);
}
问:如果想打印p指针本身的地址,如何弄?
答:printf("%p",&p);
问:p2=p是如何赋值的?
答:p的指针内容(里面存的是个地址)赋给p2。
问:p,p2存储的内容(地址)相同,它们两个的地址相同?
答:不同,可以通过打印他们的地址:printf("%p",&p); printf("%p",&p2); 来对比一下。

[root@vm0000055 ~]# ./a.out
a=8
a=0xbf8df31c
p=0xbf8df31c
p2=0xbf8df318
*p2=0xbf8df31c
**p2=8


#include
int main()
{
int a=8;
int *p;
int **p2;
p=&a;
p2 = &p;
printf("a=%d\n",a);
printf("&a=%p\n",&a);
printf("p=%p\n",p);

printf("p2=%p\n",p2);
printf("&p2=%p\n",&p2);
printf("*p2=%p\n",*p2);
printf("**p2=%d\n",**p2);
}

[root@vm0000055 ~]# ./a.out
a=8
a=0xbfb3cd7c
p=0xbfb3cd7c
p2=0xbfb3cd78
*p2=0xbfb3cd7c
**p2=8

问:上面程序p2,*p2,**p2有什么区别?
答:printf("p2=%p\n",p2);打印的是p2指针的内容(它的内容是一个整形的指针变量),也就是p的地址&p(也就是指针p的地址,当然这个地址里面存着p的内容)
      printf("*p2=%p\n",*p2);,而*p2也就是p的内容(a的地址),前面说过*就是取内容。
     printf("**p2=%d\n",**p2);在前面再加一个*,也就是取到了a的地址后,在取到这个地址指向的内容,及时相当于printf("%d",a);
如还不熟悉参考:
yahoo一题目:把一个字符串倒序:
http://blog.5ifd.com/post/1883/

                                                                                                                       最后呢,版权所有,向东,呵呵!




买了MSS后,一直在想怎么把它用好,之前由于系统的东东少,所以大部分软件和功能都要手动实现,记起刚玩的时候,那叫一个累!现在www.openmss.cn推出了一键安装包,一下子使得MSS的使用变得异常简单,如果不算开始给硬盘清零,只要十几分钟就能搞定。不过,一键安装包装完后,还要再进行一些个性化的设置,我总结了一下:阅读全文
分页: 241/339 第一页 上页 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 下页 最后页 [ 显示模式: 摘要 | 列表 ]