引言:
指针是什么?
指针的本质就是地址。
为了形象理解,若把变量a当作人,内存当作人住的房间,而地址(也就是指针)就是门牌号,寻找a也就可以通过找门牌号来寻找。
内存单元的编号=地址=指针
1.指针变量与地址
1.1取地址操作符(&)
我们已经知道了指针代表的地址,那我们如何得到这个地址呢?
因此 我们引入&
int a=10;
&a;
1.2指针变量与解引用操作符(*)
1.2.1指针变量
将地址取出来之后存放在哪里呢?即答:指针变量中。
int a=10;
int *p=&a;
p就称为指针变量。顾名思义,变量——>可以改变的量
我们可以像a=10样把地址赋给p
1.2.2解引用操作符*
那么,知道地址后如何找到指向的对象呢?
此时我们引入解引用操作符*
int a=10;
int *p=&a;
*p=10;
可以通过改变*p来改变a
1.3指针变量的大小
32位平台————>X86(4字节)
64位平台————>X64 (8字节)
指针大小与类型无关,在相同平台下,大小相等。
1.4指针变量类型的意义
1.4.1指针变量的类型
指针变量类型是用于表示指针指向对象的类型。
如:
int *p=0;
char *pa='A';
1.4.2指针的解引用
对以下代码:
int n = 1000;
char* p = (char*)&n;
*p = 0;
结果如下:
原因是:char*类型 *p 只能访问1个字节
int*类型 *p 能访问4个字节
总结:
类型决定了对指针解引用时的权限(能存放几个字节)
1.4.3 void*指针
void* p(泛型指针)
对其强制类型转化有多种用法
多用于函数参数部分使函数可以处理多种类型的数据
1.5 const修饰指针
int const *p--->限制*p,但p可以改变
int * const p--->限制p,但*p可以改变
const * const p--->均不可以改变
1.6指针运算
* 指针+-整数---->与类型有关
* 指针-指针---->所求是元素之间的个数
* 指针关系运算---->是关于地址存放位置的比较
1.7野指针
野指针:指针指向的位置是随机未知的
如:未初始化 越界访问 指针指向的空间释放~等等
那么,如何规避野指针呢?
可以进行指针初始化
int *p=NULL;
1.8assert 断言
头文件 <assert.h>
assert(p!=NULL);
p!=NULL 程序运行,否则报错
2.数组指针
3.二级指针
int a=10;
int *p=&a;
int **pp=&p;
*pp=p
**pp=a
4.指针数组
5.函数指针
存放函数地址,可以通过地址调用函数
int (*pf3) (int x, int y)
| | |
| | |
| | pf3指向函数的参数类型和个数的交代
| 函数指针变量名
pf3指向函数的返回类型
通过函数指针调用函数
6.函数指针数组
本质:数组
数组的元素为函数的地址
如:int (*p[3])(int x,int y)