1、概念数组
指针是一种数据类型,能够操做内存;函数
指针本质上是地址,指向以它为地址的内存单元;指针
指针变量是存放内存地址的变量。code
2、指针常量与常量指针对象
char * const p:指针常量 ,本质是常量,这个指针是一个常量;
const char *p :常量指针 ,本质是指针, 这个指针指向一个常量。blog
① const char *p 和 char const *p: const修饰 *p,*p 只读 ,不能够修改, p 能够改变;
② char * const p: const修饰p,p只读 ,不能够修改, *p 能够修改;
③ const char * const p: *p 和 p都是只读不可修改。内存
3、指针的运算class
* 对指针指向的内存的地址进行取值操做
& 取指针变量存放的位置
++ 增长一个单位长度的地址
-- 减少一个单位长度的地址
+ 加一个数字表示增长数字个单位的长度的地址
- 减一个数字表示减小数字个单位的长度的地址变量
4、空指针 NULL数据类型
能够指向任何类型对象的地址。
5、野指针
指向一个非法的或已销毁的内存的指针。
① 指针变量没有被初始化 char *p;
② 指针p被free或者delete以后,只是把指针所指的内存释放掉了,没有改变指针的值(置空)。
6、万能指针
void * 能够指向任意变量的内存空间 void指针能够和其余类型的指针任意转换 可是不能直接参与指针运算。
7、指针与数组的区别和联系
① 数组是存放多个相同类型数据的集合,指针存放的是地址。数组名能够表明存放数组的内存地址,因此数组名本质上是一个指针;
② 同类型指针变量能够相互赋值,数组只能一个一个元素的赋值或拷贝;
③ 数组在内存中是连续存放的,开辟一块连续的内存空间。数组是根据数组的下标进行访问的;
指针很灵活,它能够指向任意类型的数据。指针的类型说明了它所指向地址空间的内存;
④ 数组的大小:经过sizeof(数组名)/sizeof(数据类型)计算;
指针的大小:在32位平台下,不管指针的类型是什么,sizeof(指针名)都是4;
在64位平台下,不管指针的类型是什么,sizeof(指针名)都是8。
8、指针做为函数的参数时
① 在声明&定义函数时,将参数定义为指针形式,在调用该函数时,传入对应的指针变量便可;
② 在调用指针参数的函数时,函数形参将传入的指针实参中存储的地址进行了复制,在函数内对指针所指向的内存进行直接操做,天然会修改原 实参指针 所指向的内存区域,由于这两个指针指向的内存区域同样。
9、引用与指针的区别
① 引用的本质是指针 ,引用的底层实现是指针;
② 引用不是实体变量 ,指针是实体变量;
void* int* char* double* 4/8
int& char& double&
③ 引用变量必须初始化 ,指针变量能够初始化 也能够不初始化(野指针);
④ 引用变量一经初始化 ,不能再引用其它对象;
指针初始化以后 能够改变指向 int * const p = &a;
⑤ 引用不能够为空引用 ,指针能够为空指针 NULL;
⑥ 能够声明指针的引用, 但不能够声明引用的指针;
int *p = NULL; int*& rp = p;//指针的引用 int a = 0; int& ra = a; int& *p = &ra;//不行 错误的 int *p = &ra;
⑦ 能够声明指针的指针 ,但不能够声明引用的引用;
int a = 0; int& ra = a; int&& rra = ra;//错误的 int& rra = ra;
⑧ 能够声明数组的引用 ,但不能够声明引用的数组;
int arr[5] = {}; int (&ra)[5] = arr;//数组的引用 ra等同于arr int a,b,c,d,e; int& arr[5] = {a,b,c,d,e};//错误的 不行的
⑨ 万能指针 void* 没有万能引用 void&。
10、高级指针
① 指针数组
本质是数组 ,数组里的元素是指针。
int* arr[10]; char * str[10];
② 数组指针
本质是指针 ,指针指向一个数组。
int arr[10]; int (*pArr)[10] = &arr; int brr[5][8]; int (*pBrr)[8] = brr; int (*pB)[5][8] = &brr;
③ 函数指针 本质是指针, 指针指向一个函数。 ④ 指针函数 本质是函数 ,函数返回一个指针。 ⑤ 函数指针数组: 本质是数组, 数组里的元素是 函数指针。