有指针语言 C 和 无指针语言 Java 的值传递个引用传递

基本指针

Java、Python 这种传递对象的时候,自动传递指针地址。
C、C++、Go 这种有指针的语言传递对象的时候,需要显示的定义指针。

/**
 * 基本类型和String自动是值传递,传递拷贝
 * 对象自动引用传递,传递地址指针.
 */
public static void main(String[] args) {
    Linked.LinkedNode node = new Linked.LinkedNode();
    node.data = 1;
    changeObjectValue(node);
    System.out.println(node.data);
    String str = "hello";
    changeStringValue(str);
    System.out.println(str);
    int number = 0;
    changeNumberValue(number);
    System.out.println(number);
}
private static void changeObjectValue(Linked.LinkedNode node) {
    node.data = 2;
}
private static void changeStringValue(String str) {
    str = "change";
}
private static void changeNumberValue(int number) {
    number = 2;
}

output

2
hello
0

go

func main() {
	str := "hello"
	changeString(str)
	fmt.Printf("name=%#v\n", str)
	user := User{
		name: "hello",
	}
	changeUser(user)
	fmt.Printf("user=%#v\n", user)
}
func changeString(str string)  {
	str = "change"
}
func changeUser(user User)  {
	user.name = "change"
}

output

name="hello"
user=main.User{name:"hello"}

多指针传递和方法传参

结论:方法传参都是值的拷贝,因为指针是地址,所以拷贝的也是地址,所以可以修改指向的值

在这里插入图片描述

//指针直接赋值为空是无效的
//指针直接在方法中赋值为另一个指针为什么回来之后也是无效的???不是吧???
//我这么理解,方法都是值的拷贝,然后指针拷贝的是地址,通过地址,我们可以修改地址的值,但是,如果是
//【强行修改指针,比如指针为NULL或者直接修改指针的地址,只是修改了拷贝的地址,没有修改原指针】、
//除非我们使用耳机指针,修改指针的指针,才能修改到
//这玩意是一层一层的,懂了呢,指针只能修改指针的下一层,java对象只能修改对象的属性,
//对象的对象,就是指针的指针才能修改指针的值.
//user1=(*pinter.User)(nil)
//user2=&pinter.User{name:"user2"}
//user1=&pinter.User{name:"user2"}
//user2=&pinter.User{name:"user2"}
func TestChangeUser(t *testing.T) {
	var user1 *User
	var user2 *User
	user2 = &User{name: "user2"}
	changeUser(user1,user2)
	fmt.Printf("user1=%#v\n", user1)
	fmt.Printf("user2=%#v\n", user2)
	changeUserPointer(&user1,&user2)
	fmt.Printf("user1=%#v\n", user1)
	fmt.Printf("user2=%#v\n", user2)
}
func changeUser(user1,user2 *User)  {
	user1 = user2
}
func changeUserPointer(user1,user2 **User)  {
	*user1 = *user2
}

空指针只是针对指针,就是指针指向的地址是空的
比如 User 不能为 nil
但是 User 指向的 地址可以为 nil
懂了么
所以 只有 *User 才能为空,所有的空指针都是地址

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JarvanStack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值