免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1819 | 回复: 0
打印 上一主题 下一主题

在Java里应用另类的指针 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-02 03:59 |只看该作者 |倒序浏览

                                                                众所周知,在Java编程语言里是没有类似C/C++里头的指针(Pointer)的。
比如,以下的代码,以C/C++来呈现的话肯定没问题。
但如果以Java来编写,那就得不到我们所要求的结果了。
void Swap(int num1, int num2)  //数字对调函数
{
    int tmp=num1;
    num1=num2;
    num2=tmp;
}
运行的指令:
int n1=10;
int n2=20;
System.out.printf("Before:n1=%d,n2=%d\n",n1,n2);
Swap(n1,n2);
System.out.printf("After :n1=%d,n2=%d\n",n1,n2);
输出结果:
Before:n1=10,n2=20
After :n1=10,n2=20
不过,这个问题是可以用另一种方式解决。
尽管Java在创造时就已经排除掉指针(pointer)这个非常好用的功能,
但是,它还是保留了类似指针功能的reference。
因为Java的array与object都是以reference来表示的。
Java的reference就像C++里的reference (&)一样。
只要善加利用以及加上编程的技巧,就能达到指针的功效了。
public class Main {
    public static void main(String[] args) {
        int[] n1=NewInt(10);
        int[] n2=NewInt(20);
        System.out.printf("Before:n1=%d,n2=%d\n",Value(n1),Value(n2));
        Swap(n1,n2);
        System.out.printf("After :n1=%d,n2=%d\n",Value(n1),Value(n2));
    }
    public static void Swap(int[] num1, int[] num2) {
        int tmp=num1[0];
        num1[0]=num2[0];
        num2[0]=tmp;
    }
    public static int[] NewInt(int value) {
        int[] array=new int[1];
        array[0]=value;
        return array;
    }
    public static int Value(int[] array) {
        return array[0];
    }
}
输出结果:
Before:n1=10,n2=20
After :n1=20,n2=10
这个现象是可以更加的发扬光大到类的物件的。
比如:
class IOBuf {
    public int buffer;
    public IOBuf() {
        buffer=0;
    }
}
class IO {
    public int Addr;
    public int Bit;
    public IOBuf rBuf;
   
    public IO(int addr, int bit, IOBuf buf) {
        Addr=addr;
        Bit=bit;
        rBuf=buf;
    }
    public void SetOn() {
        rBuf.buffer|=Bit;
    }
    public void SetOff() {
        rBuf.buffer&=0xffff-Bit;
    }
}
  运行的指令:
  IOBuf buf1=new IOBuf();
  IOBuf buf2=new IOBuf()
  IO[] BitTable={ new IO(0x200,0x0001,buf1),
                  new IO(0x200,0x0002,buf1)
                  new IO(0x201,0x0001,buf2)
                  new IO(0x201,0x0002,buf2)
                 };
  MyIO=BitTable.clone();
  MyIO[0].SetOff();
  MyIO[1].SetOn();
  MyIO[2].SetOn();
  MyIO[3].SetOff();
  System.out.printf("%d,%d\n",buf1.buffer,buf2.buffer);
  System.out.printf("%d,%d,\n",MyIO[0].rBuf.buffer,MyIO[1].rBuf.buffer);
  System.out.printf("%d,%d,\n",MyIO[2].rBuf.buffer,MyIO[3].rBuf.buffer);
  System.out.printf("\n");
  MyIO[0].SetOn();
  MyIO[1]SetOff();
  MyIO[2].SetOff();
  MyIO[3]SetOn();
  System.out.printf("%d,%d\n",buf1.buffer,buf2.buffer);
  System.out.printf("%d,%d\n",MyIO[0].rBuf.buffer,MyIO[1].rBuf.buffer);
  System.out.printf("%d,%d\n",MyIO[2].rBuf.buffer,MyIO[3].rBuf.buffer);
在这里,BitTable是local(本地)的变量,而MyIO是global(全局)的变量。
上述的代码是方便初始化IO[]里的参数。
输出结果:
2,1
2,2
1,1
1,2
1,1
2,2
也就是说MyIO[0].rBuf.buffer与MyIO[1].rBuf.buffer是指向buf1.buffer,
而MyIO[2].rBuf.buffer与MyIO[3].rBuf.buffer则是指向buf2.buffer的。
其实这个“漏洞”,当我在学Python时就发现了,没想到Java也是一样的。
               
               
               
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/41429/showart_2108880.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP