- 引用 就是变量的另一名字,不在内存中单独存储
指针 存储变量的地址,可以改变指向
int main() {
int a = 10;// 变量
int * pa = &a; // 指针
int & b = a; // 引用
printf("a: %d\n", a);// a: 10
printf("*pa: %d\n", *pa);// *pa: 10
printf("b: %d\n", b);// b: 10
*pa = 20;
printf("a: %d\n", a);// a: 20
printf("*pa: %d\n", *pa);// *pa: 20
printf("b: %d\n", b);// b: 20
b = 30;
printf("a: %d\n", a);// a: 30
printf("*pa: %d\n", *pa);// *pa: 30
printf("b: %d\n", b);// b: 30
a = 40;
printf("a: %d\n", a);// a: 40
printf("*pa: %d\n", *pa);// *pa: 40
printf("b: %d\n", b);// b: 40
return 0;
}
golang
函数是值传递(拷贝副本,内存地址不同),没有引用传递。map
,chan
返回指针类型;slice
和map
、chan
都不太一样的,一样的是,它也是引用类型,它也可以在函数中修改对应的内容。slice
是一种结构体+元素指针的混合类型,通过元素array
(Data
)的指针,可以达到修改slice
里存储元素的目的。 ```go type SliceHeader struct { Data uintptr Len int Cap int }
type slice struct { array unsafe.Pointer len int cap int } ``` 内置函数 new 计算类型大小,为其分配零值内存,返回指针。而 make 会被编译器翻译 成具体的创建函数,由其分配内存和初始化成员结构,返回对象而非指针。
make 用来创建map、slice、channel
new 用来创建值类型