有很多人,都说自已的计算机如何慢、如何慢,其实令自已的计算机慢的原因,如果将所有原因算出来,简直多的是!不过我会在这里简介一下令计算机慢的主因!
1、在开机时加载太多程序
2、桌面上开启桌布
3、没有定期清理硬磁盘和重组硬磁盘
以下的,我就会很详细地说明一下如何加速计算机和令计算机慢的病征!解决七大常见影响计算机表现的原凶当计算机忽然慢下来时,你可能会怀疑自己是否做错了甚么而引致损害了计算机?其实不必太介怀,因为一个小小改变,都可能会影响到计算机运作表现,而且在使用计算机的过程中,无可避免地都会引起各种些微的改变。任何问题总有方法可以解决的,就让我细细道出七大常见影响计算机表现的原因,解决了它们之后,便可以安心享用计算机的高性能。
4、删除常驻程序
何谓常驻程序呢?常驻程序就是在开机时加载的程序,而那些程序就叫做常驻程序。常驻程序不但拖慢开机时的速度,而且更快地消耗计算机资源以及内存,但你可能会问:那些程序全都有用的耶!那我可以答你的就是:你想要那些有用的程序来牺牲速度,还是不要那些程序来回复速度呢?自己想一想吧!一般来说,如果想删除常驻程序,可去"启动"清单中删除,但如果想详细些,例如是icq、popkiller 之类的软件,是不能在"启动"清单中删除的,要去"附属应用程序",然后去 "系统工具",再去"系统信息",进去后,按上方工具列的"工具",再按"系
统组态编辑程序",进去后,在"启动"的对话框中,就会详细列出在启动电
脑时加载的常驻程序了!
5、桌面上不要摆放桌布和关闭activedesktop
不知大家有否留意到,我们平时一直摆放在桌面的桌布,其实是很浪费计算机资源的!不但如此,而且还拖慢计算机在执行应用程序时的速度!本想美化桌面,但又拖慢计算机的速度,在这时,你是否会有一种"不知怎样"的感觉呢?还有一点,不知大家有否试过,就是当开启桌布时,每逢关闭一个放到最大的窗口时,窗口总是会由上而下、慢慢、慢慢地落,如果有这种情况出现,你必须关闭桌布!方法是:在桌面上按鼠标右键,再按内容,然后在"背景"的对话框中,选"无",建议在"外观"的对话框中,在桌面预设的青绿色,改为黑色......至于关闭activedesktop,即是叫你关闭从桌面上的web画面,例如在桌面上按鼠标右键,再按内容,然后在"背景"的对话框中,有一幅桌布,名为windows98,那副就是web画面了!所以千万不要开启。依我所说,布只可拿四个字来形容,就是"红颜祸水"!
6、删除一些不必要的字型
系统运行得慢的其中一个原因,就是字型多少的关系!安装的字型愈多,就占用愈多的内存,从而拖慢计算机的速度!所以我们要删除一些不必要的字型。要删除一些不必要的字型,你可到控制台,再进去一个叫"字型"的数据夹,便可删除字型,但,要怎样才知道,那些字有用,那些字没用呢?例如:如果你不常到 ms_dos模式的话,就删除dos 字型!因为各个人都可能喜爱某种字型,所以我也不能确定要删除那些
字型,不过我在此,有个秘决教你,如果你有华康粗黑字型,且又有新
细明体的字型,建议你删除华康粗黑字型,如果你有新细明体,且又有细明体,就删除细明体吧!
7、定期重组硬磁盘
计算机硬盘中最细小的单位是扇区,一个档案通常会占用若干扇区,每当硬盘用久了,无数次的新增、更改和删除档案后,就会造成很多断断续续的扇区,因而非连续性的档案便会愈来愈多,硬盘磁头便需要花更多时间跳来跳去来读取数据,这就导致硬盘速度减慢。有见及此,windows才会有"重组磁盘"出现。只要执行"重组磁盘",所有非连续性的档案都会被重新编排得整整齐齐,至于执行时间,大约一星期左右执行一次便可了。
8、设定虚拟内存
硬盘中有一个很宠大的数据交换文件,它是系统预留给虚拟内存作暂存的地方,很多应用程序都经常会使用到,所以系统需要经常对主存储器作大量的数据存取,因此存取这个档案的速度便构成影响计算机快慢的非常重要因素!一般win98预设的是由系统自行管理虚拟内存,它会因应不同程序所需而自
动调校交换档的大小,但这样的变大缩小会给系统带来额外的负担
,令系统运作变慢!有见及此,用家最好自定虚拟内存的最小值和最大值,避免经常变换大小。要设定虚拟内存,在"我的计算机"中按右键,再按内容,到"效能"的对话框中,按"虚拟内存",然后选择"让自已设定虚拟内存设定值",设定"最小值"为64,因为我的计算机是32mbram,所以我就设定为64,即是说,如果你的内存是64mbram,那在"最小值"中,就设为128。顺带一提,在"效能"的对话框中,选择"档案",将原先设定的" 桌上型计算机",改为"网络服务器",是会加快系统运作的;还有,在"磁盘"的对话框中,不要选"每次开机都搜寻新的磁盘驱动器",是会加快开机速度的!
9、更改开机时的设定
虽然你已知道了如何新增和移除一些常驻程序,但你又知不知道,在开机至到进入win98的那段时间,计算机在做着什么呢?又或者是,执行着什么程序呢?那些程序,必定要全部载完才开始进入win98,你有否想过,如果可删除一些不必要的开机时的程序,开机时的速度会否加快呢?答案是会的!想要修改,可按"开始",选"执行",然后键入win.ini,开启后,可以把以下各段落的内容删除,是删内容,千万不要连标题也删除!它们包括:[compatibility]、[compatibility32]、[imecompatibility]、[compatibility95]、[modulecompatibility]和。
10、彻底删除程序
大家都知道,如果想移除某些程序,可到"新增/移除程序"中移除,但大家又知不知道,它只会帮你移除程序,而不会帮你移除该程序的注册码和一些登录项目呢?这不是win98蠢,而是它在这方面不够专业,要彻底删除程序,要找回些"专业"删除软件来移除才成事!先前symantec公司出品的nortonuninstall(以下简称为nud),因为有某部份破坏了某些删除软件的版权,故此全世界已停止出售,正因如此,symantec才出了cleansweep(以下简称为cs),不过论功能上,还是nud更胜一寿!言归正传,其实除了这两个软件外,还有很多同类软件都能有效地移除程序,既然nud已绝版,那我就说cs吧。下载并安装后,如果你想移除程序,只要用cs来移除,它便会一拼移除该程序的登录项目和注册码!我在此帮"新增/移除程序"改了个别名,就是"新增垃圾、移除程序"!垃圾是指被遗弃的登录项目和注册码,程序就是程序啰!
做好以上十点,相信你的爱机已经是健步如飞了。当然了,如果还是很慢的话,那就应该考虑硬件升级了
2009年5月10日星期日
一招!杜绝autorun病毒
一招!杜绝autorun病毒
1. 运行CMD,进入DOS界面,因为这个非法的文件夹只能在DOS下创建。
2. 输入“X:”回车(不含引号,下同),其中X表示盘符,比如你有C、D、E等硬盘分区,或者把U盘插上后的盘符,记得不要试图在光驱盘符上操作哟。
3. 输入“md autorun.inf”,创建autorun.inf文件夹;
4. 输入“cd autorun.inf”,进入autorun.inf文件夹;
5. 输入“md haha..\”,haha可随意起各其他名字,但不要太长,三五字符个即可。注意这是关键的一步,haha的后面一定要输入两个点和一个反斜杠,这样建立的就是一个含有非法字符的文件夹,windows下无法进入也无法删除了。
6. 回到窗口界面,试试删除这个文件夹~ 嘿嘿,一般方法删不掉的哦~
此方法能对付大部分的autorun病毒!
1. 运行CMD,进入DOS界面,因为这个非法的文件夹只能在DOS下创建。
2. 输入“X:”回车(不含引号,下同),其中X表示盘符,比如你有C、D、E等硬盘分区,或者把U盘插上后的盘符,记得不要试图在光驱盘符上操作哟。
3. 输入“md autorun.inf”,创建autorun.inf文件夹;
4. 输入“cd autorun.inf”,进入autorun.inf文件夹;
5. 输入“md haha..\”,haha可随意起各其他名字,但不要太长,三五字符个即可。注意这是关键的一步,haha的后面一定要输入两个点和一个反斜杠,这样建立的就是一个含有非法字符的文件夹,windows下无法进入也无法删除了。
6. 回到窗口界面,试试删除这个文件夹~ 嘿嘿,一般方法删不掉的哦~
此方法能对付大部分的autorun病毒!
巧妙破解Windows XP登陆口令
Windows XP强大而友好的系统界面博得了越来越多用户的青睐,然而它对用户安全性的审核即是非常严格的,要是你忘记了设置的口令(密码),可别以为能够像Windows 98那样选择“取消”同样可以进入系统--这一点相信安装Windows XP的你,是很清楚的。当然这也是有过痛苦的经历后,才被我们重视的。
由于没有登陆口令,无法进入系统;起初的方法总是选择重新安装Windows XP,但这种方法但繁琐,而且费时费力,经过多次实验之后,终于找到了一个可以不需要任何其它软件,就可破解Windows XP登录口令的方法:
但是破解登陆口令,需要有两个必要的前提:
1.安装Windows XP的分区必须采用FAT32文件系统;
2.用户名中没有汉字。
在确认满足这两个条件后,即可执行以下步骤,来破解登陆口令。
1.开机启动Win XP,当运行到“正在启动Windows XP”的提示界面时,按“F8”键调出系统启动选择菜单,选择“带命令行安全模式”;
2.当运行停止后,会列出“Administrator”和其它用户的选择菜单(本例的其他用户以xpuser01为例),选择“Administrator”后回车,进入命令行模式;
3.键入命令““net user xpuser01 1234/ADD”这是更改该用户密码的命令,命令中的“1234”是更改后的新密码,如果键入的用户不存在(xpuser01),那么系统会自动添加这个用户。
4.另外还可以使用“net 1oca1group administrator xpuser01 /ADD”命令把xpuser01这个用户升为超级用户,即可拥有所有权限。
5.最后一步,就是重新启动计算机,在登录窗口中输入刚刚更改的新密码便可成功登陆。
如果你正在为丢失了登陆口令而烦恼的话,不妨试一试此方法
由于没有登陆口令,无法进入系统;起初的方法总是选择重新安装Windows XP,但这种方法但繁琐,而且费时费力,经过多次实验之后,终于找到了一个可以不需要任何其它软件,就可破解Windows XP登录口令的方法:
但是破解登陆口令,需要有两个必要的前提:
1.安装Windows XP的分区必须采用FAT32文件系统;
2.用户名中没有汉字。
在确认满足这两个条件后,即可执行以下步骤,来破解登陆口令。
1.开机启动Win XP,当运行到“正在启动Windows XP”的提示界面时,按“F8”键调出系统启动选择菜单,选择“带命令行安全模式”;
2.当运行停止后,会列出“Administrator”和其它用户的选择菜单(本例的其他用户以xpuser01为例),选择“Administrator”后回车,进入命令行模式;
3.键入命令““net user xpuser01 1234/ADD”这是更改该用户密码的命令,命令中的“1234”是更改后的新密码,如果键入的用户不存在(xpuser01),那么系统会自动添加这个用户。
4.另外还可以使用“net 1oca1group administrator xpuser01 /ADD”命令把xpuser01这个用户升为超级用户,即可拥有所有权限。
5.最后一步,就是重新启动计算机,在登录窗口中输入刚刚更改的新密码便可成功登陆。
如果你正在为丢失了登陆口令而烦恼的话,不妨试一试此方法
让你的电脑达到最强安全的配置
1.察看本地共享资源
运行CMD输入net share,如果看到有异常的共享,那么应该关闭。但是有时你关闭共享下次开机的时候又出现了,那么你应该考虑一下,你的机器是否已经被黑客所控制了,或者中了病毒。
2.删除共享(每次输入一个)
net share admin$ /delete
net share c$ /delete
net share d$ /delete(如果有e,f,……可以继续删除)
3.删除ipc$空连接
在运行内输入regedit,在注册表中找到 HKEY_LOCAL_MACHINE SYSTEM CurrentControSet Control LSA 项里数值名称RestrictAnonymous的数值数据由0改为1。
4.关闭自己的139端口,ipc和RPC漏洞存在于此。
关闭139端口的方法是在“网络和拨号连接”中“本地连接”中选取“Internet协议(TCP/IP)”属性,进入“高级TCP/IP设置”“WinS设置”里面有一项“禁用TCP/IP的NETBIOS”,打勾就关闭了139端口。
5.防止rpc漏洞
打开管理工具——服务——找到RPC(Remote Procedure Call (RPC) Locator)服务——将故障恢复中的第一次失败,第二次失败,后续失败,都设置为不操作。
XP SP2和2000 pro sp4,均不存在该漏洞。
6.445端口的关闭
修改注册表,添加一个键值
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\NetBT\Parameters在右面的窗口建立一个SMBDeviceEnabled 为REG_DWORD类型键值为 0这样就ok了
7.3389的关闭
XP:我的电脑上点右键选属性-->远程,将里面的远程协助和远程桌面两个选项框里的勾去掉。
Win2000server 开始-->程序-->管理工具-->服务里找到Terminal Services服务项,选中属性选项将启动类型改成手动,并停止该服务。(该方法在XP同样适用)
使用2000 pro的朋友注意,网络上有很多文章说在Win2000pro 开始-->设置-->控制面板-->管理工具-->服务里找到Terminal Services服务项,选中属性选项将启动类型改成手动,并停止该服务,可以关闭3389,其实在2000pro 中根本不存在Terminal Services。
8.4899的防范
网络上有许多关于3389和4899的入侵方法。4899其实是一个远程控制软件所开启的服务端端口,由于这些控制软件功能强大,所以经常被黑客用来控制自己的肉鸡,而且这类软件一般不会被杀毒软件查杀,比后门还要安全。
4899不象3389那样,是系统自带的服务。需要自己安装,而且需要将服务端上传到入侵的电脑并运行服务,才能达到控制的目的。
所以只要你的电脑做了基本的安全配置,黑客是很难通过4899来控制你的。
9、禁用服务
打开控制面板,进入管理工具——服务,关闭以下服务
1.Alerter[通知选定的用户和计算机管理警报]
2.ClipBook[启用“剪贴簿查看器”储存信息并与远程计算机共享]
3.Distributed File System[将分散的文件共享合并成一个逻辑名称,共享出去,关闭后远程计算机无法访问共享
4.Distributed Link Tracking Server[适用局域网分布式链接? 倏突Ф朔馷
5.Human Interface Device Access[启用对人体学接口设备(HID)的通用输入访问]
6.IMAPI CD-Burning COM Service[管理 CD 录制]
7.Indexing Service[提供本地或远程计算机上文件的索引内容和属性,泄露信息]
8.Kerberos Key Distribution Center[授权协议登录网络]
9.License Logging[监视IIS和SQL如果你没安装IIS和SQL的话就停止]
10.Messenger[警报]
11.NetMeeting Remote Desktop Sharing[netmeeting公司留下的客户信息收集]
12.Network DDE[为在同一台计算机或不同计算机上运行的程序提供动态数据交换]
13.Network DDE DSDM[管理动态数据交换 (DDE) 网络共享]
14.Print Spooler[打印机服务,没有打印机就禁止吧]
15.Remote Desktop Help& nbsp;Session Manager[管理并控制远程协助]
16.Remote Registry[使远程计算机用户修改本地注册表]
17.Routing and Remote Access[在局域网和广域往提供路由服务.黑客理由路由服务刺探注册信息]
18.Server[支持此计算机通过网络的文件、打印、和命名管道共享]
19.Special Administration Console Helper[允许管理员使用紧急管理服务远程访问命令行提示符]
20.TCP/IPNetBIOS Helper[提供 TCP/IP 服务上的 NetBIOS 和网络上客户端的 NetBIOS 名称解析的支持而使用户能够共享文件、打印和登录到网络]
21.Telnet[允许远程用户登录到此计算机并运行程序]
22.Terminal Services[允许用户以交互方式连接到远程计算机]
23.Window s Image Acquisition (WIA)[照相服务,应用与数码摄象机]
如果发现机器开启了一些很奇怪的服务,如r_server这样的服务,必须马上停止该服务,因为这完全有可能是黑客使用控制程序的服务端。
10、账号密码的安全原则
首先禁用guest帐号,将系统内建的administrator帐号改名~~(改的越复杂越好,最好改成中文的),而且要设置一个密码,最好是8位以上字母数字符号组合。 (让那些该死的黑客慢慢猜去吧~)
如果你使用的是其他帐号,最好不要将其加进administrators,如果加入administrators组,一定也要设置一个足够安全的密码,同上如果你设置adminstrator的密码时,最好在安全模式下设置,因为经我研究发现,在系统中拥有最高权限的帐号,不是正常登陆下的adminitrator帐号,因为即使有了这个帐号,同样可以登陆安全模式,将sam文件删除,从而更改系统的administrator的密码!而在安全模式下设置的administrator则不会出现这种情况,因为不知道这个administrator密码是无法进入安全模式。权限达到最大这个是密码策略:用户可以根据自己的习惯设置密码,下面是我建议的设置(关于密码安全设置,我上面已经讲了,这里不再罗嗦了。
打开管理工具.本地安全设置.密码策略
1.密码必须符合复杂要求性.启用
2.密码最小值.我设置的是8
3.密码最长使用期限.我是默认设置42天
4.密码最短使用期限0天
5.强制密码历史 记住0个密码
6.用可还原的加密来存储密码 禁用
11、本地策略:
这个很重要,可以帮助我们发现那些心存叵测的人的一举一动,还可以帮助我们将来追查黑客。
(虽然一般黑客都会在走时会清除他在你电脑中留下的痕迹,不过也有一些不小心的)
打开管理工具
找到本地安全设置.本地策略.审核策略
1.审核策略更改 成功失败
2.审核登陆事件 成功失败
3.审核对象访问 失败
4.审核跟踪过程 无审核
5.审核目录服务访问 失败
6.审核特权使用 失败
7.审核系统事件 成功失败
8.审核帐户登陆时间 成功失败
9.审核帐户管理 成功失败
&nb sp;然后再到管理工具找到
事件查看器
应用程序:右键>属性>设置日志大小上限,我设置了50mb,选择不覆盖事件
安全性:右键>属性>设置日志大小上限,我也是设置了50mb,选择不覆盖事件
系统:右键>属性>设置日志大小上限,我都是设置了50mb,选择不覆盖事件
12、本地安全策略:
打开管理工具
找到本地安全设置.本地策略.安全选项
1.交互式登陆.不需要按 Ctrl+Alt+Del 启用 [根据个人需要,? 但是我个人是不需要直接输入密码登陆的]
2.网络访问.不允许SAM帐户的匿名枚举 启用
3.网络访问.可匿名的共享 将后面的值删除
4.网络访问.可匿名的命名管道 将后面的值删除
5.网络访问.可远程访问的注册表路径 将后面的值删除
6.网络访问.可远程访问的注册表的子路径 将后面的值删除
7.网络访问.限制匿名访问命名管道和共享
8.帐户.(前面已经详细讲过拉
运行CMD输入net share,如果看到有异常的共享,那么应该关闭。但是有时你关闭共享下次开机的时候又出现了,那么你应该考虑一下,你的机器是否已经被黑客所控制了,或者中了病毒。
2.删除共享(每次输入一个)
net share admin$ /delete
net share c$ /delete
net share d$ /delete(如果有e,f,……可以继续删除)
3.删除ipc$空连接
在运行内输入regedit,在注册表中找到 HKEY_LOCAL_MACHINE SYSTEM CurrentControSet Control LSA 项里数值名称RestrictAnonymous的数值数据由0改为1。
4.关闭自己的139端口,ipc和RPC漏洞存在于此。
关闭139端口的方法是在“网络和拨号连接”中“本地连接”中选取“Internet协议(TCP/IP)”属性,进入“高级TCP/IP设置”“WinS设置”里面有一项“禁用TCP/IP的NETBIOS”,打勾就关闭了139端口。
5.防止rpc漏洞
打开管理工具——服务——找到RPC(Remote Procedure Call (RPC) Locator)服务——将故障恢复中的第一次失败,第二次失败,后续失败,都设置为不操作。
XP SP2和2000 pro sp4,均不存在该漏洞。
6.445端口的关闭
修改注册表,添加一个键值
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\NetBT\Parameters在右面的窗口建立一个SMBDeviceEnabled 为REG_DWORD类型键值为 0这样就ok了
7.3389的关闭
XP:我的电脑上点右键选属性-->远程,将里面的远程协助和远程桌面两个选项框里的勾去掉。
Win2000server 开始-->程序-->管理工具-->服务里找到Terminal Services服务项,选中属性选项将启动类型改成手动,并停止该服务。(该方法在XP同样适用)
使用2000 pro的朋友注意,网络上有很多文章说在Win2000pro 开始-->设置-->控制面板-->管理工具-->服务里找到Terminal Services服务项,选中属性选项将启动类型改成手动,并停止该服务,可以关闭3389,其实在2000pro 中根本不存在Terminal Services。
8.4899的防范
网络上有许多关于3389和4899的入侵方法。4899其实是一个远程控制软件所开启的服务端端口,由于这些控制软件功能强大,所以经常被黑客用来控制自己的肉鸡,而且这类软件一般不会被杀毒软件查杀,比后门还要安全。
4899不象3389那样,是系统自带的服务。需要自己安装,而且需要将服务端上传到入侵的电脑并运行服务,才能达到控制的目的。
所以只要你的电脑做了基本的安全配置,黑客是很难通过4899来控制你的。
9、禁用服务
打开控制面板,进入管理工具——服务,关闭以下服务
1.Alerter[通知选定的用户和计算机管理警报]
2.ClipBook[启用“剪贴簿查看器”储存信息并与远程计算机共享]
3.Distributed File System[将分散的文件共享合并成一个逻辑名称,共享出去,关闭后远程计算机无法访问共享
4.Distributed Link Tracking Server[适用局域网分布式链接? 倏突Ф朔馷
5.Human Interface Device Access[启用对人体学接口设备(HID)的通用输入访问]
6.IMAPI CD-Burning COM Service[管理 CD 录制]
7.Indexing Service[提供本地或远程计算机上文件的索引内容和属性,泄露信息]
8.Kerberos Key Distribution Center[授权协议登录网络]
9.License Logging[监视IIS和SQL如果你没安装IIS和SQL的话就停止]
10.Messenger[警报]
11.NetMeeting Remote Desktop Sharing[netmeeting公司留下的客户信息收集]
12.Network DDE[为在同一台计算机或不同计算机上运行的程序提供动态数据交换]
13.Network DDE DSDM[管理动态数据交换 (DDE) 网络共享]
14.Print Spooler[打印机服务,没有打印机就禁止吧]
15.Remote Desktop Help& nbsp;Session Manager[管理并控制远程协助]
16.Remote Registry[使远程计算机用户修改本地注册表]
17.Routing and Remote Access[在局域网和广域往提供路由服务.黑客理由路由服务刺探注册信息]
18.Server[支持此计算机通过网络的文件、打印、和命名管道共享]
19.Special Administration Console Helper[允许管理员使用紧急管理服务远程访问命令行提示符]
20.TCP/IPNetBIOS Helper[提供 TCP/IP 服务上的 NetBIOS 和网络上客户端的 NetBIOS 名称解析的支持而使用户能够共享文件、打印和登录到网络]
21.Telnet[允许远程用户登录到此计算机并运行程序]
22.Terminal Services[允许用户以交互方式连接到远程计算机]
23.Window s Image Acquisition (WIA)[照相服务,应用与数码摄象机]
如果发现机器开启了一些很奇怪的服务,如r_server这样的服务,必须马上停止该服务,因为这完全有可能是黑客使用控制程序的服务端。
10、账号密码的安全原则
首先禁用guest帐号,将系统内建的administrator帐号改名~~(改的越复杂越好,最好改成中文的),而且要设置一个密码,最好是8位以上字母数字符号组合。 (让那些该死的黑客慢慢猜去吧~)
如果你使用的是其他帐号,最好不要将其加进administrators,如果加入administrators组,一定也要设置一个足够安全的密码,同上如果你设置adminstrator的密码时,最好在安全模式下设置,因为经我研究发现,在系统中拥有最高权限的帐号,不是正常登陆下的adminitrator帐号,因为即使有了这个帐号,同样可以登陆安全模式,将sam文件删除,从而更改系统的administrator的密码!而在安全模式下设置的administrator则不会出现这种情况,因为不知道这个administrator密码是无法进入安全模式。权限达到最大这个是密码策略:用户可以根据自己的习惯设置密码,下面是我建议的设置(关于密码安全设置,我上面已经讲了,这里不再罗嗦了。
打开管理工具.本地安全设置.密码策略
1.密码必须符合复杂要求性.启用
2.密码最小值.我设置的是8
3.密码最长使用期限.我是默认设置42天
4.密码最短使用期限0天
5.强制密码历史 记住0个密码
6.用可还原的加密来存储密码 禁用
11、本地策略:
这个很重要,可以帮助我们发现那些心存叵测的人的一举一动,还可以帮助我们将来追查黑客。
(虽然一般黑客都会在走时会清除他在你电脑中留下的痕迹,不过也有一些不小心的)
打开管理工具
找到本地安全设置.本地策略.审核策略
1.审核策略更改 成功失败
2.审核登陆事件 成功失败
3.审核对象访问 失败
4.审核跟踪过程 无审核
5.审核目录服务访问 失败
6.审核特权使用 失败
7.审核系统事件 成功失败
8.审核帐户登陆时间 成功失败
9.审核帐户管理 成功失败
&nb sp;然后再到管理工具找到
事件查看器
应用程序:右键>属性>设置日志大小上限,我设置了50mb,选择不覆盖事件
安全性:右键>属性>设置日志大小上限,我也是设置了50mb,选择不覆盖事件
系统:右键>属性>设置日志大小上限,我都是设置了50mb,选择不覆盖事件
12、本地安全策略:
打开管理工具
找到本地安全设置.本地策略.安全选项
1.交互式登陆.不需要按 Ctrl+Alt+Del 启用 [根据个人需要,? 但是我个人是不需要直接输入密码登陆的]
2.网络访问.不允许SAM帐户的匿名枚举 启用
3.网络访问.可匿名的共享 将后面的值删除
4.网络访问.可匿名的命名管道 将后面的值删除
5.网络访问.可远程访问的注册表路径 将后面的值删除
6.网络访问.可远程访问的注册表的子路径 将后面的值删除
7.网络访问.限制匿名访问命名管道和共享
8.帐户.(前面已经详细讲过拉
2009年5月3日星期日
JAVA基本字符串
其实字符串是没有的,它是从字符型中衍生出来的,我们借助String类来生成相应的字符串。
在字符串中我们要以双引号做为定界符号,并注意转义字符的使用,例如以下字符串是全法的:
“Hello Word” “” “\n” “Hello”+”Word”
一、 字符串的创建:可以使用赋值运算符或是使用类的构造函数
1、 使用赋值运算符:“=”
例:以下是合法的:
String s1=”Hello Word”;
String s2=”everybody”;
String s3=s1+s2;
但通过上节课的学习我们知道,直接将一个其它类型的值赋值给字符串是不合法的,如:
float f=3.12;
String s=f;
需要通过类的toString()方法实现
Float F=new float(3.12);
String s=F.toString();
2、使用String类的构造函数:一共七种如下
构造方法 功能描述
String() 创建一个空字符串
String(String s) 根据字符串创建一个新字符串
String(char[] charArray) 根据字符数组创建一个新字符串
String(char[] charArray,int off,int len) 根据字符数组的指定部分创建一个新字符串
off为起始位置,len为字符数
String(byte[],int highbyte) 根据字符数组创建一个新字符串,highbyte为高
位字节
String(byte[],int highbyte,int off,int len) 根据字节数组的指定部分创建一个新字符串
String(StringBuffer) 根据StringBuffer对象创建一个新字符串
我们看下面的例子:
public class StringTest{
public static void main(String args[]){
char charArray[]={'P','R','O','G','R','A','M'};
String s0=new String(); //等同于String s0=""
String s1=new String("PROGRAM"); //等同于String s1="PROGRAM"
String s2=new String(s1); //等同于String s2=s1
String s3=new String(charArray);
String s4=new String(charArray,2,4); //从第二位后的4 位
System.out.println(s0);
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
System.out.println(s4);
}
}
二、 字符串连接
(1) 通过”+”号直接连接两个字符串,当第一个是字符串而第二个是数值时,则后者转换成字符串后进行连接。看下面例子:
public class StringConnect{
public static void main(String args[]){
String s1="Hello Word";
String s2="everyone!";
String s3=s1+s2;
int i=500;
String s4=s3+i;
System.out.println(s3);
System.out.println(s4);
}
}
(2) 利用concat()方法实现连接,如下例:
public class StringConnect{
public static void main(String args[]){
String s1="Hello ";
String s2="word!";
String s3=s1.concat(s2);
System.out.println(s3);
在字符串中我们要以双引号做为定界符号,并注意转义字符的使用,例如以下字符串是全法的:
“Hello Word” “” “\n” “Hello”+”Word”
一、 字符串的创建:可以使用赋值运算符或是使用类的构造函数
1、 使用赋值运算符:“=”
例:以下是合法的:
String s1=”Hello Word”;
String s2=”everybody”;
String s3=s1+s2;
但通过上节课的学习我们知道,直接将一个其它类型的值赋值给字符串是不合法的,如:
float f=3.12;
String s=f;
需要通过类的toString()方法实现
Float F=new float(3.12);
String s=F.toString();
2、使用String类的构造函数:一共七种如下
构造方法 功能描述
String() 创建一个空字符串
String(String s) 根据字符串创建一个新字符串
String(char[] charArray) 根据字符数组创建一个新字符串
String(char[] charArray,int off,int len) 根据字符数组的指定部分创建一个新字符串
off为起始位置,len为字符数
String(byte[],int highbyte) 根据字符数组创建一个新字符串,highbyte为高
位字节
String(byte[],int highbyte,int off,int len) 根据字节数组的指定部分创建一个新字符串
String(StringBuffer) 根据StringBuffer对象创建一个新字符串
我们看下面的例子:
public class StringTest{
public static void main(String args[]){
char charArray[]={'P','R','O','G','R','A','M'};
String s0=new String(); //等同于String s0=""
String s1=new String("PROGRAM"); //等同于String s1="PROGRAM"
String s2=new String(s1); //等同于String s2=s1
String s3=new String(charArray);
String s4=new String(charArray,2,4); //从第二位后的4 位
System.out.println(s0);
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
System.out.println(s4);
}
}
二、 字符串连接
(1) 通过”+”号直接连接两个字符串,当第一个是字符串而第二个是数值时,则后者转换成字符串后进行连接。看下面例子:
public class StringConnect{
public static void main(String args[]){
String s1="Hello Word";
String s2="everyone!";
String s3=s1+s2;
int i=500;
String s4=s3+i;
System.out.println(s3);
System.out.println(s4);
}
}
(2) 利用concat()方法实现连接,如下例:
public class StringConnect{
public static void main(String args[]){
String s1="Hello ";
String s2="word!";
String s3=s1.concat(s2);
System.out.println(s3);
学习C++的最大难度
学习C++的最大难度
困难度之一
“C++ 是个难学易用的语言”,这句话相信很多人都心有戚戚。C++的学习难度,一在于语言本身太多的“幕”,另一个就在于 "paradigm shift" (思考模式的移转)。
传统语言如 C, Pascal, Basic, Fortran...,除了模样看起来稍有不同,基本上都是函式 call 来 call 去,大同小异,很容易掌握。你想做的动作,在 code 中都看得一清二楚。你所看不到的,也不过就是编译器为你的函式加上用以处理堆叠的一小段码(prologue 和 epilogue),这一小段码基本上做的是 housekeeping 工作,你没看到也没有关系,并不影响你对程式逻辑的思考。
C++ 不一样,C++ 有太多和程式逻辑息息相关的动作是编译器为我们加上去的。换句话说 C++ 编译器为我们“加码”。如果不识清这一节,学习C++ 有如雾里看花,雾非雾,花非花。
编译器为我们的 C++ 程式加了什么码呢?很多!物件诞生时 ctor 会被唤起,物件死亡时 dtor 会被唤起,这都是加码的结果。ctor 中设定vtpr 和 vtbl,这也是加码的结果。new 单一物件时会产生 memory block cookie,new 物件阵列时会产生一个内部结构记录着 object size 和 class ctor...,这也都是布幕后的工作。可以说,程式码中看不到而却必须完成的所有与程式逻辑有关的动作,统统都是 C++ 编译器加码后的结果。
当“继承”发生,整个情况变得稍微复杂起来。“多重继承”又更复杂一些,“虚拟继承”又再更复杂一些。
这些布幕后的主题,统可归类为所谓的 C++ object model(物件模型)。如果不知道这些底层机制,你就只能够把 "make destructors virtual in base classes"或 "never treat arrays polymorphically"这类规则硬背下来,却不明白它的道理。用一样东西,却不明白它的道理,林语堂如是说:“不高明”。只知道 how,不知道 why。
困难度之二
C++ 的第二个学习难度在于 "paradigm shift"(思考模式的移转)。别说自己设计classes 了,光使用别人的classes,就都是一种思考模式和行为模式的移转。MFC(或 OWL 或 VCL)programmer 必然能够领略并体会其中的意思。
使用所谓的 application framework(一种大型的、凝聚性强的、有着物件导向公共基础建设的 class library),你的码和 framework 之间究竟是怎样的关系呢?framework 提供的一大堆可改写的虚拟函式的意义与价值究竟在哪里呢?为什么 framework 所设计的种种美好性质以及各式各样的演算法竟然可以施行于我们自己设计的 class types 身上呢?framework 被设计时,也并不知道我们的存在。这正是物件导向中的多型(polymorphism)的威力。
稍早所说的 C++ 物件模型,偏属程式设计的低层面;这里所说的思考模式移转,则是程式设计的高层面。能够把新思维模式的威力发挥得最淋漓尽致的,当推物件导向的 polymorphism(多型)和 generalization(泛型)。如果你没有使用这两项特性,等于入 C++ 宝山却空手而归。
反覆磨炼,循环震荡
想像 C++ 是一把用来解决程式问题的刀,要它坚轫,要它锋利,就必须经过多次的回火,在高热和骤冷之间——炼。
初学 C++ 语法(syntax)之后,你应该尽快尝试体验 polymorphism(大致而言也就是虚拟函式的运用)。等到对 OOP 的精神有了大局掌控的能力,但对 C++ 的许多小细节不甚清楚,就是回到C++ 物件模型 炼的时机。
成长,是在高阶(polymorphism)和低阶(object model)之间反覆震荡,才能够震荡到更高的位阶,而不是平平庸庸于中阶(C++ syntax)的一滩死水。
困难度之一
“C++ 是个难学易用的语言”,这句话相信很多人都心有戚戚。C++的学习难度,一在于语言本身太多的“幕”,另一个就在于 "paradigm shift" (思考模式的移转)。
传统语言如 C, Pascal, Basic, Fortran...,除了模样看起来稍有不同,基本上都是函式 call 来 call 去,大同小异,很容易掌握。你想做的动作,在 code 中都看得一清二楚。你所看不到的,也不过就是编译器为你的函式加上用以处理堆叠的一小段码(prologue 和 epilogue),这一小段码基本上做的是 housekeeping 工作,你没看到也没有关系,并不影响你对程式逻辑的思考。
C++ 不一样,C++ 有太多和程式逻辑息息相关的动作是编译器为我们加上去的。换句话说 C++ 编译器为我们“加码”。如果不识清这一节,学习C++ 有如雾里看花,雾非雾,花非花。
编译器为我们的 C++ 程式加了什么码呢?很多!物件诞生时 ctor 会被唤起,物件死亡时 dtor 会被唤起,这都是加码的结果。ctor 中设定vtpr 和 vtbl,这也是加码的结果。new 单一物件时会产生 memory block cookie,new 物件阵列时会产生一个内部结构记录着 object size 和 class ctor...,这也都是布幕后的工作。可以说,程式码中看不到而却必须完成的所有与程式逻辑有关的动作,统统都是 C++ 编译器加码后的结果。
当“继承”发生,整个情况变得稍微复杂起来。“多重继承”又更复杂一些,“虚拟继承”又再更复杂一些。
这些布幕后的主题,统可归类为所谓的 C++ object model(物件模型)。如果不知道这些底层机制,你就只能够把 "make destructors virtual in base classes"或 "never treat arrays polymorphically"这类规则硬背下来,却不明白它的道理。用一样东西,却不明白它的道理,林语堂如是说:“不高明”。只知道 how,不知道 why。
困难度之二
C++ 的第二个学习难度在于 "paradigm shift"(思考模式的移转)。别说自己设计classes 了,光使用别人的classes,就都是一种思考模式和行为模式的移转。MFC(或 OWL 或 VCL)programmer 必然能够领略并体会其中的意思。
使用所谓的 application framework(一种大型的、凝聚性强的、有着物件导向公共基础建设的 class library),你的码和 framework 之间究竟是怎样的关系呢?framework 提供的一大堆可改写的虚拟函式的意义与价值究竟在哪里呢?为什么 framework 所设计的种种美好性质以及各式各样的演算法竟然可以施行于我们自己设计的 class types 身上呢?framework 被设计时,也并不知道我们的存在。这正是物件导向中的多型(polymorphism)的威力。
稍早所说的 C++ 物件模型,偏属程式设计的低层面;这里所说的思考模式移转,则是程式设计的高层面。能够把新思维模式的威力发挥得最淋漓尽致的,当推物件导向的 polymorphism(多型)和 generalization(泛型)。如果你没有使用这两项特性,等于入 C++ 宝山却空手而归。
反覆磨炼,循环震荡
想像 C++ 是一把用来解决程式问题的刀,要它坚轫,要它锋利,就必须经过多次的回火,在高热和骤冷之间——炼。
初学 C++ 语法(syntax)之后,你应该尽快尝试体验 polymorphism(大致而言也就是虚拟函式的运用)。等到对 OOP 的精神有了大局掌控的能力,但对 C++ 的许多小细节不甚清楚,就是回到C++ 物件模型 炼的时机。
成长,是在高阶(polymorphism)和低阶(object model)之间反覆震荡,才能够震荡到更高的位阶,而不是平平庸庸于中阶(C++ syntax)的一滩死水。
C语言指针使用方法
为初学者服务。这是本文的宗旨。指针是c和c++中的难点和重点。有些程序员们精通dos下的basic。c语言的其它各种特性,在basic中都有类似的东西。只有指针,是baisc所不具备的。指针是c的灵魂。
我不想重复大多数书上说得很清楚的东西,我只是把我看过的书中说得不清楚或没有说,而我又觉得我理解得有点道理的东西写出来。
1、指针的概念
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。
先声明几个指针放着做例子:
例一:
复制内容到剪贴板代码:
(1)int*ptr;
(2)char*ptr;
(3)int**ptr;
(4)int(*ptr)[3];
(5)int*(*ptr)[4];
1、指针的类型
从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型:
复制内容到剪贴板代码:
(1)int*ptr;
//指针的类型是int*
(2)char*ptr;
//指针的类型是char*
(3)int**ptr;
//指针的类型是int**
(4)int(*ptr)[3];
//指针的类型是int(*)[3]
(5)int*(*ptr)[4];
//指针的类型是int*(*)[4]
怎么样?找出指针的类型的方法是不是很简单?
2、指针所指向的类型
当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。
从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如:
复制内容到剪贴板代码:
(1)int*ptr;
//指针所指向的类型是int
(2)char*ptr;
//指针所指向的的类型是char
(3)int**ptr;
//指针所指向的的类型是int*
(4)int(*ptr)[3];
//指针所指向的的类型是int()[3]
(5)int*(*ptr)[4];
//指针所指向的的类型是int*()[4]
在指针的算术运算中,指针所指向的类型有很大的作用。指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C越来越熟悉时,你会发现,把与指针搅和在一起的"类型"这个概念分成"指针的类型"和"指针所指向的类型"两个概念,是精通指针的关键点之一。
3、指针的值,或者叫指针所指向的内存区或地址
指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。
指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。
指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在例一中,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存区是不存在的,或者说是无意义的。
以后,每遇到一个指针,都应该问问:这个指针的类型是什么?指针指向的类型是什么?该指针指向了哪里?
4、指针本身所占据的内存区
指针本身占了多大的内存?你只要用函数sizeof(指针的类型)测一下就知道了。在32位平台里,指针本身占据了4个字节的长度。指针本身占据的内存这个概念在判断一个指针表达式是否是左值时很有用。
第二章 指针的算术运算
指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的。例如:
例二:
复制内容到剪贴板代码:
1.chara[20];
2.int*ptr=a;
...
...
3.ptr++;
在上例中,指针ptr的类型是int*,它指向的类型是int,它被初始化为指向整形变量a。接下来的第3句中,指针ptr被加了1,编译器是这样处理的:它把指针ptr的值加上了sizeof(int),在32位程序中,是被加上了4。
由于地址是用字节做单位的,故ptr所指向的地址由原来的变量a的地址向高地址方向增加了4个字节。由于char类型的长度是一个字节,所以,原来ptr是指向数组a的第0号单元开始的四个字节,此时指向了数组a中从第4号单元开始的四个字节。我们可以用一个指针和一个循环来遍历一个数组,看例子:
例三:
复制内容到剪贴板代码:
intarray[20];
int*ptr=array;
...
//此处略去为整型数组赋值的代码。
...
for(i=0;i<20;i++)
{
(*ptr)++;
ptr++;
}
这个例子将整型数组中各个单元的值加1。由于每次循环都将指针ptr加1,所以每次循环都能访问数组的下一个单元。
再看例子:
例四:
复制内容到剪贴板代码:
1.chara[20];
2.int*ptr=a;
...
...
3.ptr+=5;
在这个例子中,ptr被加上了5,编译器是这样处理的:将指针ptr的值加上5乘sizeof(int),在32位程序中就是加上了5乘4=20。由于地址的单位是字节,故现在的ptr所指向的地址比起加5后的ptr所指向的地址来说,向高地址方向移动了20个字节。
在这个例子中,没加5前的ptr指向数组a的第0号单元开始的四个字节,加5后,ptr已经指向了数组a的合法范围之外了。虽然这种情况在应用上会出问题,但在语法上却是可以的。这也体现出了指针的灵活性。
如果上例中,ptr是被减去5,那么处理过程大同小异,只不过ptr的值是被减去5乘sizeof(int),新的ptr指向的地址将比原来的ptr所指向的地址向低地址方向移动了20个字节。
总结一下,一个指针ptrold加上一个整数n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值增加了n乘sizeof(ptrold所指向的类型)个字节。就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向高地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。
一个指针ptrold减去一个整数n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值减少了n乘sizeof(ptrold所指向的类型)个字节,就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向低地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。
我不想重复大多数书上说得很清楚的东西,我只是把我看过的书中说得不清楚或没有说,而我又觉得我理解得有点道理的东西写出来。
1、指针的概念
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。
先声明几个指针放着做例子:
例一:
复制内容到剪贴板代码:
(1)int*ptr;
(2)char*ptr;
(3)int**ptr;
(4)int(*ptr)[3];
(5)int*(*ptr)[4];
1、指针的类型
从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型:
复制内容到剪贴板代码:
(1)int*ptr;
//指针的类型是int*
(2)char*ptr;
//指针的类型是char*
(3)int**ptr;
//指针的类型是int**
(4)int(*ptr)[3];
//指针的类型是int(*)[3]
(5)int*(*ptr)[4];
//指针的类型是int*(*)[4]
怎么样?找出指针的类型的方法是不是很简单?
2、指针所指向的类型
当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。
从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如:
复制内容到剪贴板代码:
(1)int*ptr;
//指针所指向的类型是int
(2)char*ptr;
//指针所指向的的类型是char
(3)int**ptr;
//指针所指向的的类型是int*
(4)int(*ptr)[3];
//指针所指向的的类型是int()[3]
(5)int*(*ptr)[4];
//指针所指向的的类型是int*()[4]
在指针的算术运算中,指针所指向的类型有很大的作用。指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C越来越熟悉时,你会发现,把与指针搅和在一起的"类型"这个概念分成"指针的类型"和"指针所指向的类型"两个概念,是精通指针的关键点之一。
3、指针的值,或者叫指针所指向的内存区或地址
指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。
指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。
指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在例一中,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存区是不存在的,或者说是无意义的。
以后,每遇到一个指针,都应该问问:这个指针的类型是什么?指针指向的类型是什么?该指针指向了哪里?
4、指针本身所占据的内存区
指针本身占了多大的内存?你只要用函数sizeof(指针的类型)测一下就知道了。在32位平台里,指针本身占据了4个字节的长度。指针本身占据的内存这个概念在判断一个指针表达式是否是左值时很有用。
第二章 指针的算术运算
指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的。例如:
例二:
复制内容到剪贴板代码:
1.chara[20];
2.int*ptr=a;
...
...
3.ptr++;
在上例中,指针ptr的类型是int*,它指向的类型是int,它被初始化为指向整形变量a。接下来的第3句中,指针ptr被加了1,编译器是这样处理的:它把指针ptr的值加上了sizeof(int),在32位程序中,是被加上了4。
由于地址是用字节做单位的,故ptr所指向的地址由原来的变量a的地址向高地址方向增加了4个字节。由于char类型的长度是一个字节,所以,原来ptr是指向数组a的第0号单元开始的四个字节,此时指向了数组a中从第4号单元开始的四个字节。我们可以用一个指针和一个循环来遍历一个数组,看例子:
例三:
复制内容到剪贴板代码:
intarray[20];
int*ptr=array;
...
//此处略去为整型数组赋值的代码。
...
for(i=0;i<20;i++)
{
(*ptr)++;
ptr++;
}
这个例子将整型数组中各个单元的值加1。由于每次循环都将指针ptr加1,所以每次循环都能访问数组的下一个单元。
再看例子:
例四:
复制内容到剪贴板代码:
1.chara[20];
2.int*ptr=a;
...
...
3.ptr+=5;
在这个例子中,ptr被加上了5,编译器是这样处理的:将指针ptr的值加上5乘sizeof(int),在32位程序中就是加上了5乘4=20。由于地址的单位是字节,故现在的ptr所指向的地址比起加5后的ptr所指向的地址来说,向高地址方向移动了20个字节。
在这个例子中,没加5前的ptr指向数组a的第0号单元开始的四个字节,加5后,ptr已经指向了数组a的合法范围之外了。虽然这种情况在应用上会出问题,但在语法上却是可以的。这也体现出了指针的灵活性。
如果上例中,ptr是被减去5,那么处理过程大同小异,只不过ptr的值是被减去5乘sizeof(int),新的ptr指向的地址将比原来的ptr所指向的地址向低地址方向移动了20个字节。
总结一下,一个指针ptrold加上一个整数n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值增加了n乘sizeof(ptrold所指向的类型)个字节。就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向高地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。
一个指针ptrold减去一个整数n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值减少了n乘sizeof(ptrold所指向的类型)个字节,就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向低地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。
订阅:
博文 (Atom)