概念
指针:一个变量的地址称为该变量的指针,而存放这个地址的称为指针变量。
引用:对于一个数据,可以建立起其“引用”,相当于给变量起别名。
区别
指针有值,而引用只是一个声明
引用在声明后需要初始化,并不能在使用作为另一个变量的引用。其本质与引用的变量公用同一个空间。
在函数传参的时候,使用
int add(int *a, int *b)
int add(int &a, int &b)
前者需要新建空间,其创建的是函数传入参数的指针变量的地址值(形参),而引用并未创建出新的形参,不需要空间。这里细微的减小了系统内存的开销(虽然不是很多)
在引用的使用上面会有许多的限制,比如:
1)不能建立引用数组
2)不能建立引用的引用,也没有引用的指针
我们更加常用的把引用作为函数传参参数,这一做法不会产生新的开销。
指针的使用
常见的指针使用方式在C++相关书籍里记录的比较详尽,这里主要列出一些个人容易出错的部分
1. 指针数组和数组的指针
指针数组本质是一系列的指针变量,而数组的指针是一个指向数组0地址的指针变量。
int a[10];
int *p = a; //<可以使用p去访问数组a
int *p[4]; //<这是一个指针数组,p优先和[4]结合
2.函数指针的写法
int max(int a, int b);
int (*p)(int, int);//<括号一定要有,否则成了返回指针的函数了
p = max;
还有就是可以合理的运用typedef进行函数指针的使用
typedef void (*p)(deque<int>&);
p func;
void sortM2L(deque<int> &in);
func = sortM2L;
deque<int> q(N, 0);
func(q);
3.const指针的使用
int a;
const int *p1 = &a; //<指向常量的指针,无法通过p1去更改a的值,但可以用a进行更改
int * const p2 = &a;//<常指针,指针p2的地址无法改变
const int *const p3 = &a;//<我p3就是固定的了,别想动我((lll¬ω¬))