基本指针
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 才能为空,所有的空指针都是地址