写同期之前,写一个基础小知识吧。一个小学弟(初学者)问我什么是指针。 ummmm……. 这要用手机打字的话,估计会写到自己崩溃吧XD 恰巧身边有电脑,就记录一下。顺便把这个文章给他分享下XD

pointer我记得汉语翻译是指针,一般是c和c++中特有的一个概念。不过php中也有类似于指针的东西,至于具体名字是不是指针我就不清楚了。

想要理解指针,首先要理解的一个事情就是,内存(RAM)的作用。暂且抛却heap和stack的区别。我们在程序中所书写的所有变量(variable),函数(function)都是存储在内存之中的。 为什么存储在内存中?当然是速度快啊!当然你也可以在硬盘中一点一点读取,边用边读,当然这就是另一个话题了。 因为所有的数据都存储在RAM之中, 所以我们使用数据的进行计算的时候,也对应的要从内存中选择。 我学弟学习的是c++,我就用c++举例子好了。(不然我想用js的说TAT)

1
int a = 0;

这里的a就是指向内存中的一块被宣言成为int的一小块区域。大小是根据你系统的bit数而决定的,64bit还是32bit的话,大小也会不一样。 当然,除了基本类型,譬如stl库中的类型,也同样是被存储在内存中的。就比如下面的v就是例子。

1
2
std::vector<int> v;
v.push_back(233);

但是在传递数值的时候会产生一个问题。在譬如js,或者java一类的所谓的高等语言中,一般是会不让编程者注意到这一信息。事实上这一信息会产生一定的速度差异和优势,当然也会产生相应的编程困扰。 废话讲的有点多。暂且抛弃c++中的参照(reference)的概念,用pointer写一个简单的例子。 继续我们的基础类型int的例子。

1
2
int a = 233;
int* b = &a;

注意我们的宣言,是int,我们的类型是int。当然你写成

1
int *b = &a;

也是没有任何的错误的。

这时,这个int*类型的b就是一个pointer。他指向的是a。 什么意思呢。原本我们的a,就指向的是RAM中的一个宣言为int类型的一个小空间。如果我们

1
int c = a;

那么我们所做的,是在RAM中再确立了另一块小空间,用c来指向那里,然后把a的数值copy过去。

但是我们int*类型的b所做的,就是直接指向了a的空间。

事实上不必怀疑,int*类型本身也是会占据一定的RAM空间的,当然这是后话。

那么这样做会带来一个问题。就是,如果a的数值变了的话,会怎么样。 答案很简单。因为a的数值变了的话,a在RAM空间的数值会变化,所以b的数值也会变。但是c因为是在RAM空间的另一块区域开启的新空间,所以,a的空间变的怎样,其实是没有任何关系的。 所以即便a的数值产生了变化,c的数值也不会变。

这就是pointer和普通变量(variable)的区别。pointer赋予我们的是直接操作RAM的能力。当然会有少许的性能代价(pointer本身也会占据内存)。也会有相当程度的风险,比如memory leak。 (爱,老哥我毕业论文就差点因为不小心写出了memory leak没法用程序验证理论,险些GG。多亏了valgrind这个神程序。。。。)

当然,c和c++语言中的pointer,当然是不仅仅只有这个功能,还跟array有着密不可分的关系,所以说c写起来才让人头疼啊。。。。

PS:这个array的汉语翻译我没找到。。。 这个等我今天晚上回家再继续码字吧!

参考资料: 暂无。


creativ common license