【问题标题】:Reference type in java and pointers in C differencejava中的引用类型和C中的指针的区别
【发布时间】:2015-10-19 01:19:04
【问题描述】:

我试图了解 java 中的引用类型和 C 中的指针之间的区别。

我用 C 和 Java 编写了以下两个程序。

C:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int *p;
    int *q;

    int a = 5;

    p = &a;

    q = p;

    printf("before q: %p\n",q);

    p = NULL;

    printf("before p: %p\n",q);

    return 0;
}

这里 p & q 都指向同一个位置。现在 p 中的任何影响都不会影响 q。

Java:

class BoxDemo
{
    int width;
    int height;
    int length;
}


class Box {

    public static void main(String[] args) {

        BoxDemo b1 = new BoxDemo();
        BoxDemo b2 = b1;


        System.out.println("after: b2: " + b2);
        b1 = null;
        System.out.println("before: b2:  " + b2);


    }
}

这里 b1 和 b2 指向同一个位置。但是,在 b1 中所做的更改不会反映在 b2 中。

那么,引用和指针这两种类型有什么区别呢?两者都一样吗?

【问题讨论】:

  • 您取消了 b1 引用,您没有对值 b1 引用进行任何更改。
  • 那么,b2的值不应该也为null吗?
  • 你的c和java代码不一样。你在哪里将指针设置为你的 c 代码中的空值?
  • 在您的 Java 代码中,您使 b1b2 引用同一个对象,然后将 b1 设置为 null。为什么您期望重新分配一个变量来更改另一个变量引用的内容?

标签: java c pointers reference


【解决方案1】:

null 是参考,而不是价值。考虑类似

class BoxDemo {
    public int width;
    public int height;
    public int length;

    @Override
    public String toString() {
        return String.format("%d x %d x %d", width, height, length);
    }
}

然后在将引用分配给b2 之后修改b1.width。类似的东西

public static void main(String[] args) {
    BoxDemo b1 = new BoxDemo();
    b1.width = b1.height = b1.length = 100;
    BoxDemo b2 = b1;
    b1.width = 2;
    System.out.println(b2);
}

输出是

2 x 100 x 100

因为b2b1 引用相同的BoxDemo 实例。

【讨论】:

  • 感谢您的回答。请查看编辑。
【解决方案2】:
*p = 10;

表示将p指向的地址内的值改为10 由于 p 和 q 都指向同一个地址,所以它们都看到这个地址内的值等于 10 .... 这相当于:

BoxDemo b1 = new BoxDemo();
BoxDemo b2 = b1;
b1.someIntegerParameterInside = 10;
System.out.print(b2.someIntegerParameterInside); //will print 10

同时

b1 = null;

意思是,将b1指向的对象地址)改成另一个地址,相当于

p = &v;

其中 v 是另一个 int 变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 2011-03-14
    相关资源
    最近更新 更多