指针,揭开你的盖头来(三)

来源:互联网 发布:本地小说阅读软件 编辑:程序博客网 时间:2024/05/19 12:17

开始了解指针

好了,我们现在开始真正的进入主题。大家也许已经焦急,但是,我还是想按部就班的介绍。首先我要介绍一下指针的定义,并对其本质做详细的说明,然后对再对每一块重点的知识进行详细的说明。

那么什么是指针?指针是一个指向一块计算机内存的指示器,指针通过保存内存地址来实现指示器的作用。指针变量和普通变量不一样,普通变量保存的是实际值,而指针保存的是一个内存地址;指针变量和普通变量又相似,每一个普通变量和指针变量都有一块内存存储,且它们都有一个内存地址和一个实际值,只是指针变量的实际值是一个地址,计算机可以通过指针所保存的地址访问到这个地址所存储的实际数据。

好了,我们大概对指针有一个抽象的认识,下面我们再举例声明一个指针,这样会对指针有具体的感性认识。

int  i  = 100 ;   //假设变量i的地址是10001

int * j = &i;

//     j = ?

//    *j = ?

我们首先声明一个普通变量i,并对i初始化赋值100;再定义一个指针变量j,给指针变量j初始化赋值为变量i的地址。那么我们知道指针变量j的值就是普通变量i的地址,即10001;指针变量j指向的值是普通变量i的值,即100

这是一个简单的指针的声明,声明指针时在数据类型和变量之间加一个*,这个*表明了这是在声明一个指针,*后面的变量是一个指针变量。这个指针变量的类型是一个int型。在这里我们要特别注意一点:这个 *可以和数据类型挨着,也可以和变量挨着,也可以和谁都不挨,自己就站在中间。在C/C++中并没有明确的规范它应该放在什么位置,但这个我们不必关心,我们只关心一点,那就是*夹在数据类型和变量之间说明了定义的这个变量是一个指针,这些就足够了,* 在这里就这个含义,它没有其它的任何含义。

然而,我们并不建议大家随便放在哪里,而是建议将数据类型和*挨着,因为这样有助于我们更容易理解指针。在上面的声明中,我们声明了一个指针变量i,而不是声明一个*i,如果在声明时把*i放在一起,很容易被理解为声明的这个变量是*i,这样的理解实际是错误的。我们再次对上面的声明做一个对比的理解。

int     i  =  100 ;  

int*    j  =  &i;

首先我们声明一个普通变量 i,然后再声明一个指针变量j,我们应该把*int看作是一体的,是这样的(int*),指针变量和普通变量的声明唯一的区别就是在数据类型的后面加一个*,而不是在变量前面加一个*。理解到这一点很重要。

在给指针赋值时我们用到一个符号&,这里的&叫做地址操作符,在一个变量的前面加&表明是取这个变量的地址。那么我们上面就是给指针变量j赋值为变量i的地址。

另外我们还要特别注意一点,*在指针的内容里还有另一个用途,它单独在变量前面表明了是取这个指针变量指向的实际值。这时*被称作引用操作符,在C/C++中属于单目操作符的一种。接着上面的例子:

j  =  10001 ;

*j  =  100  ;

指针变量j的值是10001,而指针变量指向的内存地址的值 *j 100。在这里我们要注意到这个*和变量前面没有数据类型,只有在声明指针变量时才会有数据类型。前面我们在建议声明指针时将数据类型和*放在一起的另一个主要原因是能和单目操作符的*简单的区分。

好了,总结一下,*在指针内容里有两个作用:

1,  夹在数据类型和变量之间表明是声明一个指针;

2,  单独出现在变量前表明是取这个指针变量所指向的内存的实际值,这是*被称作引用操作符。

另外,我还要提示一点,*&C/C++里分别代表指针和引用,有关指针和引用的区别

以及*&在使用上的区别请参考我的另一篇文章《指针和引用操作符的区别》。