都说go指着跟 c 的比较像,其实不是很明白普通变量和指针的区别
看到有人说 其实 普通变量 是程序创造出来的,比如说 c 中
a int
那么在编译时 就会有 [a 地址 int] 这样来标识内存
普通变量a其实是语言本身创造了,是为了更方便的表示内存。我们对a进行访问其实就是直接对内存进行访问。至于a表示的内存的地址是多少,程序员一般不用关心。编译器会自动分配地址,也就是常说的为a分配一个地址。如果想知道a的地址也可以通过&a得知。
我的理解是 普通变量 就像是 房间(内存)外面的 门牌号(总经理室),指针就是这个房间的地址(A座701)
变量是运行时系统给这个内存起的别名,内存地址是唯一的,程序中当我想拿到这个内存的值的时候,因为知道它的别名,所以直接用别名访问就可以得到值,又或者我能知道它唯一的地址我也能得到它的值,其实是两种不同的内存访问方式,但是变量是会变的,地址是不会变的。比如在go中
package main
func main(){
a := 10 //此时有一块内存存放了10,它的地址由系统自动分配,别名是a
a = 20 //内存存放的10变成了20
var p *int
p = &a //或者直接写 p := &a
//上面的p是一个指针,通过 *p 的方式同样可以访问 变量a指向 的内存
/*当你动态申请内存的时候,指针的存在意义之一就被体现出来了*/
ptr := new(int)
//申请了一块内存空间,没有办法指定别名,new()返回内存地址,用指针接收
//此时并没有变量能直接指向这块内存,所以只能通过内存地址来访问
}
看到有个解释还可以,是说指针和普通变量区别的
1+2这个表达式永远得值3
a+b这个表达式只依赖于a,b的值—–按名字访问称为直接访问
*p + *q 这个表达式的值随着p,q指向的变量不同而不同—-按指针访问称为间接访问
直接代表简单—-用枪剌只能剌到对手的正面
间接代表灵活—-用三截棍却能打到对手的背面
如果有更好的解释再补充