指针用来指向数据对应的内存地址。Python没有指针的概念,也就不存在操作指针的事情。
先明确两个概念:
- 指针传递:只是将内存地址提供给调用方进行操作,任何的数据改动都会影响到内存地址对应的原值
- 值传递:将内存地址对应的原值拷贝一份给调用方,任何数据改动都不会影响到原值。
Python中的深拷贝和浅拷贝底层也是这么区分的。
来看一个值传递的例子,给函数传参。
运行结果
在Go中假设我们要操作int变量s的指针,会使用到2个符号
获取变量s的指针地址:
获取指针地址对应的值:
修改一下代码,传入div()函数的不在是变量副本的值,而是传入变量对应的指针地址
运行结果
在Go语言中下面五个默认就是指针传递,即不需要特殊声明&获取指针地址,*获取地址对应的值之类的操作。直接对它们内容进行变更,全局的引用就会生效。
- slice
- map
- channel
- interface
- func()
其他类型的数据则默认就是值传递,包括上面我们演示的普通变量s,以及下面要演示的结构体。如果结构体的内容只是姓名、住址之类不怎么改动的信息也就算了。只要结构体不是太大,值传递复制的副本也不会太占用内存。但是遇到内部属性的值经常需要变更的场景,就需要使用结构体指针来保持全局数据的一致了。例如银行的ATM机操作场景。
运行结果
总结:指针操作就是为了避免数据在内存中反复拷贝,影响效率占用资源。对于结构体而言,没有特殊需求的话只直接使用结构体指针吧,省的数据不一致。