



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
我想许多C程序员不愿意学习Java的原因就是Java不支持指针,但是现在类似于Java的C#却已经支持了指针,你可以使用unsafe关键字来告诉编译器下面的函数或者代码是不安全的。一旦你使用了unsafe,那么你就可以在unsafe区域中使用指针。 程序1 using System; class nish unsafe static void Increment(int* p) /increment the int pointed to by p *p=*p+1; public static void Main() int i = 1; /we pass the address of the int to the function as it expects a pointer unsafe Increment(&i); /now we print out the value of i Console.WriteLine (i); 当你运行这个程序,你将会看到输出结果2。这是因为你已经将变量i的地址送给了函数Increment来处理。变量i建立于栈中,&i则表示它在栈中的地址。这样在函数Increment中,p就指向i的地址,当我们对*p加1时,实际上是对变量i进行增加。 程序2 下面的程序将会让你更清楚的了解: using System; class nish unsafe public static int Main() int j=100; int k=100; Console.WriteLine(address of j=0 and address of k=1,(int)&j,(int)&k); Console.WriteLine(j=0 k=1,j,k); int *p; p=&j; Console.WriteLine(p now points to 0,(int)p); *p=200; Console.WriteLine(j=0 k=1,j,k); p=&k; Console.WriteLine(p now points to 0,(int)p); *p=300; Console.WriteLine(j=0 k=1,j,k); return 0; 当运行上面的程序,我们将得到下面的结果。你会看到一些你熟悉的东东,下面的输出结果将会清楚的看到程序执行的过程: address of j=1244312 and address of k=1244308 j=100 k=100 p now points to 1244312 j=200 k=100 p now points to 1244308 j=200 k=300 首先将变量的j的地址赋给p,这样当我们改变*p时,j的值也将自动改变。接着我们将p指向变量k的地址,这时改变*p则是在改变k。 同样需要清楚的就是变量p也有自己的地址,下面的程序将会清楚的告诉您一切。 程序 3 using System; class nish public static void Main() unsafe int a=100; int *p; p=&a; Console.WriteLine(address of a is 0,(int)&a); Console.WriteLine(p now points to 0,(int)p); Console.WriteLine(address of the pointer variable p is 0,(int)&p); 一运行上面的代码,我们将获得下面显示的输出。你将同样获得一些类似的输出,注意这里unsafe关键字的使用。 address of a is 1244312 p now points to 1244312 address of the pointer variable p is 1244308 1244308是指针变量p的地址,而1244312则是指针p所指向的地址,我们使用*p来获得。 程序 4 Okey。在最后的一个程序中,我将向大家介绍如何使用指针来操作字符串。在这个程序中存在一个程序来将一段字符串通过异或运算进行编码解码的操作。如果您将一段字符串送入这个函数这个字符串将会被编码,如果您将一段已经编码的字符送入这个函数,这段字符串将会被解码。当这并不是一个安全的加密方法,我仅仅是想通过这个例子来演示一下指针的作用。 using System; class nish public static void Main() string s=Code Project is cool; Console.Write(the original string : ); Console.WriteLine(0rn,s); char b = new char100; s.CopyTo(0,b,0,20); Console.Write(the encoded string : ); unsafe fixed(char *p=b)NEncodeDecode(p); for(int t=0;t20;t+) Console.Write(bt); Console.WriteLine(rn); Console.Write(the decoded string : ); unsafe fixed(char *p=b)NEncodeDecode(p); for(int t=0;t20;t+) Console.Write(bt); Console.WriteLine(); unsafe public static void NEncodeDecode(char *s) int w; for(int y=0;y20;y+) w=(int)*(s+y); w=w5; *(s+y)=(char)w; 下面是我得到的输出,你也同样可以得到: the original string : Code Project is cool the encoded string : Fja%Uwjofq%lv%fjji the decoded string : Code Project is cool 本例中,你会发现一个新的关键字-fixed。当你在语句或函数之前使用fixed时,你是在告诉.Net平台的垃圾回收器,在这个语句或函数执行完毕前,不得回收其所占的内存空间。fixed关键字只能在不安全的代码中使用。本例中如果不使用fixed关键字,那么这段程序的执行的结果是不可预知的,因为垃圾回收器会不断的回收这些可控制代码的所占用的内存空间。幸运的是,编译器不会允许您指向可控制变量,除非您使用了fixed关键字。 在这个函数中,你看到我使用了*(s+y)表达式。s是指向字符串的地址(注意是首地址)。y则通过循环从0增加到19。这样*(s)给我们的地址是1000,*(s+1)则是1002,*(s+2)则是1004,以此类推。编译器知道我指向的是一个字符数据,因此
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年广东省智能手机买卖合同
- 2025财产保险合同范本
- 2025家庭装修合同书协议
- 《2025年度技术总监聘用合同协议》
- 考试心态调整2025年计算机二级VB考试试题及答案
- 角色分析的试题及答案
- VB编程技巧分享试题及答案集
- 客户忠诚度与公司战略的关联试题及答案
- 法律的社会控制功能分析试题及答案
- 软考软件设计师重点前沿技术试题及答案
- 职专汽修考试题及答案
- 中医四诊考试题及答案
- x监理管理办法
- 芯片定制合同范本
- 2025年生猪屠宰兽医卫生检疫人员考试题(附答案)
- 电子商务教师资格证提升策略试题及答案
- 2025届云南省楚雄市重点名校初三一模物理试题(海淀一模)试卷含解析
- 记叙文阅读理解解析(课件)-部编版语文五年级下册阅读理解
- 2025年行政执法证资格考试必刷经典题库及答案(共130题)
- 超星尔雅学习通《红色经典影片与近现代中国发展(首都师范大学)》2025章节测试附答案
- 装修陪跑合同协议书8篇
评论
0/150
提交评论