今天在整理收藏夹的时候,又看到了这两篇非常不错的文章,关于指针和引用的,我就不翻译了,文章很简单,不过把其中我觉得很有意思的两部分结合我的理解希望说的更清楚,假定你读这篇文章之前已经知道指针,但是不是很清楚其中的部分。

首先是关于指针的一个直观的一个认识.

#include <iostream>

int main()
{
  using namespace std;

// 声明并初始化指针.
  unsigned short int * pPointer = 0;
// 定义一个unsigned short int 变量 值为35698
  unsigned short int twoInt = 35698;
// 定义一个unsigned short int 变量 值为 77
  unsigned short int oneInt = 77;
// 使用&操作符将twoInt的地址赋给指针
  pPointer = &twoInt;
// pPointer 现在的值就是twoInt的地址了

// 打印
  cout << "pPointer的内存地址:\t\t" << &pPointer << endl;
  cout << "oneInt的内存地址:\t" << &oneInt << "\t整数值:\t" << oneInt << endl;
  cout << "twoInt的内存地址:\t" << &twoInt << "\t整数值:\t" << twoInt << endl;
  cout << "pPointer所指向的地址(也就是pPoint的值):\t" << pPointer << "\t整数值:\t" << *pPointer << endl;

return 0;
}

上面这段代码,声明了一个指针,和两个整数,指针指向第一个整数,然后输出结果(每个人的输出结果不一样)是:

pPointer的内存地址:                   0xbff43314
oneInt的内存地址:                     0xbff43318       整数值:  77
twoInt的内存地址:                     0xbff4331a       整数值:  35698
pPointer所指向的地址(也就是pPoint的值): 0xbff4331a       整数值:  35698

这张图是这几个变量的内存分布图,上面一排是内存地址编号,正对我们的是该处的值

指针pPointer这个变量从最左边0xbff43314这个内存位置开始,占用了四个字节,这个一个指针占四个字节,大家都知道的,这个变量的值是一个地址,也就是他的指向地址。

pPointer 所指向的地址呢,是一个short int 类型的值所在的位置,在这里就是我们的twoint,twoint在内存中呢,是从0xbff4331a开始的,也就是说,我们的pPointer指向了twoint所在的地址,

注意,看一下左边四个方块前面的二进制数,转换成16进制就是0xbff4331a了

因此,取指针所指向的值就是35698了。指针本身的值则是0xbff4331a,指针所在的位置是0xbff43314。

参考文章:C++ : Understanding pointers

 

另一个呢是关于引用的实现原理

大家都知道,引用就是别名,比如下面这段代码

#include <iostream>
using namespace std;

int main() {
   int number = 88;          // 定义一个int变量
   int & refNumber = number; // 声明并初始化一个引用
                             // 现在他们都表示了同一个值

   cout << number << endl;    // 打印number的值 (88)
   cout << refNumber << endl; // 打印引用的值 (88)

   refNumber = 99;            // 给refNumber重新赋一个值
   cout << refNumber << endl;
   cout << number << endl;    // number的值也就变成了 (99)

   number = 55;               // 重新给number赋一个值
   cout << number << endl;
   cout << refNumber << endl; // refNumber也就变成了(55)
}

输出结果肯定一目了然,其中的原理想过没

其实,引用和指针的工作原理类似,引用变量存储了其引用变量的地址,看图

 

refNumber这个引用变量在内存中的值就是number这个被引用变量的地址.但和指针不同的是,引用是对一个地址的命名常量,因此,必须在声明引用的时候初始化。并且取值的时候,也不需要像指针一样加*,而是当作一个普通变量,直接用就行了。

参考文章:Pointers, References and Dynamic Memory Allocation