指针是变量,它存储的是变量的地址,它的类型为它能指向的变量的类型。引用是已定义变量的别名。
指针可以不初始化(虽然不太好),而声明引用必须要初始化。
int *p;
int &r; // error reference variable "r" requires an initializer
指针初始化后,还可以指向其他相同类型的变量,而引用一经声明就和变量绑定在一起了。因此,若在函数内改变了指针的指向,则不会影响到其原先指向的变量。
#include <iostream>
using namespace std;
void fun(int *a, int &b)
{
cout << "a " << &a << "\n"; // a 0x7ffc3717c318
int c = 10, d = 12;
a = &c; // 改变指针a的指向
b = d;
*a = 15;
cout << &b << "\n"; // 0x7fffd444c634
b = 16;
}
int main()
{
int na = 3, nb = 4;
int *a = &na;
int &b = nb;
cout << &nb << "\n"; // 0x7fffd444c634
cout << "a " << &a << "\n"; // a 0x7ffc3717c2e8
fun(a, b);
cout << na << " " << nb << "\n"; // 3 16
return 0;
}
对指针进行sizeof
,得到的是指针的大小,对引用进行sizeof
得到的是变量的大小。
char ch = 'a';
char *p = &ch;
char &q = ch;
cout << sizeof(p) << " " << sizeof(q) << endl; // 8 1
说明:由于指针存放的是地址,因此其大小与系统有关,64位系统,其大小为8,32为系统其大小为4,以此类推。