引用和指针(C++)

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

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

#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

 

 

comments powered by Disqus