最近稍微学习了下Go语言,Go语言真是大融合即视感,明明是静态语言,却结合了动态语言的诸多优点,写起来感觉就像个动态语言,却有着不输给静态语言的执行速度。略屌,可是现在应用还是比较窄,编程语言排行榜上前五十基本看不到他,囧。
然后Go里面使用了指针和引用这两种概念,因为之前学过C++跟Java,所以对这两者都挺有感觉的,当时指针真是整的我痛苦不堪,后来再看Java的时候,学习了引用这个概念,再回去看指针,我去,原来指针也就那么回事。。。搞懂了内存就完全搞懂了,可是看的书硬是不说这些,让人无语。所以决心自己写个入门级的指针详解,借鉴引用的概念,说说自己的理解。
先说下静态语言跟动态语言,静态语言必须先声明变量才能使用,典型代表C跟C++,其实就是int num; num = 100,动态语言代表有python,不用声明直接使用如num = 100.静态跟动态,我们常说的就是编译跟运行。把编译时就能确定的数据类型叫做静态语言,而在运行时才确定变量数据类型的叫做动态语言。这里只是先讲个题外话=_=。
好了,然后正式开始介绍。
搞懂内存就搞懂了指针跟引用。所以我们从内存概念入手研究指针。
一、指针初识
在C当中,是没有引用这个概念的,当使用a = b这个操作时,不管a是什么数据类型,他都默认发生了拷贝,但是我们有时,或者大多数时候,其实压根就不希望他拷贝,我们想操作原来的数据,不然一个2G的数组来排序,每次都复制一下,内存可是扛不住的,所以在C当中就加入了指针这个概念,指针的运行逻辑是这样的:
举个例子,这个例子的代码是C语言了。
int a = 10;
int b;
b = a;
b = 100;
int p = 10;
int *q;
q = &p;
*q = 100;
则结果a还是等于10,而p则变成100了。第一个例子就是我们刚才说的,在C当中,赋值即是拷贝,这两个已经不是同一个值了。而第二句我们都知道,因为他们指向了同一个内存地址,所以改变了其中一个,另一个也就跟着改变了。
从内存的角度去理解这些就是。内存是一个存储单元,它上面有很多很多格子,每个格子都有一个编号,我们把它叫做地址。如下:
0000 |
1000 |
0001 |