等价于C指针的指针

时间:2013-08-07 16:32:45

标签: java c pointers

我无法将指向指针的指针作为Java中函数的参数传递。我知道Java没有指针而是传递对象的引用。我想知道这是怎么做的。 为了清除我的怀疑,我正在粘贴我正在实现的程序的代码片段。

在以下程序中,我从“QuickSortRecur”方法调用方法“Partition”。 由于我大部分时间都在C上工作,所以我不知道如何将参数 newHead newEnd 作为指针指向

我还提到了以下几行的C等价物,我只是想知道如何在Java中实现相同的功能?

Java:

public ListNode Partition(ListNode lhead,ListNode lend,ListNode newHead,ListNode newEnd){
         ---------
         ---------
         ---------

    }
public ListNode QuickSortRecur(ListNode lhead,ListNode lend){
    ListNode newHead=null;
    ListNode newEnd=null;
    ListNode pivot;     

    pivot=Partition(lhead,lend,newHead,newEnd);
    if(newHead==null)
            {
            System.out.println("This is not updated ");
            }
       }

C等同于以上签名:

struct node *partition(struct node *head, struct node *end,
                       struct node **newHead, struct node **newEnd){
}

struct node *quickSortRecur(struct node *head, struct node *end)
{
struct node *pivot = partition(head, end, &newHead, &newEnd);
}

2 个答案:

答案 0 :(得分:3)

考虑到C指针粗略等同于Java的引用,与指针指针的粗略等价将是封装引用的可变类。

例如,您可以构建如下内容:

class ListNodeReference {
    private ListNode node;
    public ListNode getNode() {
        return node;
    }
    public void setNode(ListNode theNode) {
        node = theNode;
    }
}

您可以将ListNodeReference传递给可以使用其get和set方法获取或设置它的函数,这与C程序使用单个解引用来获取实际指针的方式非常相似(双重取消引用会自动发生)当您的代码访问ListNode时,因为它已经是一个引用对象。)

请记住,这是一个非常粗略的等价物,而不是一对一替换:例如,无法使用ListNode传回ListNodeReference个对象数组。

答案 1 :(得分:1)

我可以通过这个解决问题..

     public class LinkedList {
    public ListNode head;
    private ListNode newHead;
    private ListNode newEnd;

    LinkedList(){
        head = null;
        newHead=null;
        newEnd=null;
    }

    public ListNode getNewEnd() {
        return this.newEnd;
    }
    public void setNewEnd(ListNode newEnd) {
       this.newEnd=newEnd;
    }

    public ListNode getNewHead(){
        return this.newHead;
    }

    public void setNewHead(ListNode newHead){
        this.newHead=newHead;
    }

    public ListNode getHead(){
        return this.head;
    }
    public void setHead(ListNode head){
        this.head=head;
    }

public ListNode Partition(ListNode lhead,ListNode lend,LinkedList Ref){
        ListNode pivot=lend;
        ListNode End=lend;
        ListNode curr=lhead;
        //ListNode temp=null;
        ListNode previous=null;

        ListNode newHead=Ref.getNewHead();
        ListNode newEnd=Ref.getNewEnd();
                --------------------------
        -----implementation -----
                --------------------------

        Ref.setNewEnd(newEnd);
        Ref.setNewHead(newHead);
        return pivot;

        }
    public ListNode QuickSortRecur(ListNode lhead,ListNode lend){
        ListNode newHead=null;
        ListNode newEnd=null;
        ListNode pivot;     
        LinkedList linkRef=new LinkedList();

        pivot=Partition(lhead,lend,linkRef);
        newHead=linkRef.getNewHead();
        newEnd=linkRef.getNewEnd();




        return newHead;
    }


}