指针和引用是相似的概念,但并不是相同的。它们都是指向一个对象,但是指针可以允许这个指向随时变化,并且它允许你指向一个空对象。引用可不一样,引用在初始时就必须指向一个对象,并且这个指向永远不能变化,也就是说永远只能指向这个对象,不能改变。可以这么理解,指针是一个变量的指向,引用是一个常量的指向。
指针和引用在操作上也有区别,指针使用操作符* 和-> ,引用使用操作符& 和. (点)。
比如,在定义时他们使用不同的操作符:
定义指针: int *number ; // 可以不初始赋值
定义引用: string s = “hangcool” ;
string& ps = s ; // 必须初始赋值,这样ps 就指向了s 。
在指向一个变量的成员时使用不同的操作符:
指针指向:x->y ; // 指向x 指针的成员y ;
引用指向:x.y ; // 指向x 引用的成员y ;
当然我们也可以这样写:(*x).y 等价于 x->y 。
在指针的概念里必须清楚,x 代表指向某个地址的地址值,*x 代表指向某个地址的变量值。
另外,除了在定义指针和引用的地方用到* 和& ,它们还有一个重要的用途:
在变量前使用* 和& 它们有不同的含义:
* : 称作 引用操作符 。 它表示要取的是表达式所表示的地址指向的内容。它可以被翻译为“… 指向的数值” ("value pointed by") 。
比如,* mypointer 可以被读作“mypointer 指向的数值”。
& : 称作 地址或反引用操作符 。它被用作一个变量前缀,可以被翻译为“… 的地址”("address of") ,
比如,&variable1 可以被读作 variable1 的地址。