一、定义
指针和其他变量一样也要在内存中分配一段地址,唯一不同就是指针存的是其他变量的在内存中的分
配地址的首地址(这里的其他变量可以是一般变量,也可以是指针),而一般变量存的是数值,所以
把指针当一般变量来看就好。
二、注意事项
声明指针变量一定要初始化,要成好习惯。一般初始化为NULL,即指向地址为0的内存,也就是空指
针。一般变量声明不初始化,系统会分配随机值(垃圾值),而指针变量声明不初始化,系统则会分配
一个随机的地址,假如随机地址是正在使用的某个关键地址,然后我们对这个地址指向的值进行改变,
会造不可预估的失误,而这种bug查找起来很麻烦。我们没办法掌控运气,但我们可以脚踏实地去正确
做人做事,功到自然成。所以养成一个好习惯非常重要!!!
三、一级指针
int a = 10;
int *p1 = NULL;//指针初始化
p1 = &a;//把整型变量a的地址赋值给p1(&这里是取地址的意思)
*p1 = a;//(*这里是解引用的意思)
p1是指向整型变量a地址的指针,简称整型指针
四、多级指针
简单来说,就是现在指针不存一般变量的地址了,存某个指针变量的地址
int a = 10;
int *p1 = NULL;
int *p2 = NULL;
p1 = &a;
p2 = &p1;
*p1 = a;
*p2 = p1;
**p2 = a;
p2是指向指针p1地址的指针,而p1是指向整型变量a地址的指针
五、区分复杂指针类型
判断复杂指针类型,看最右边
六、指针数组
本质还是数组,数组元素变成了指针变量
int *a[10];
1、a是一个数组
2、数组元素的指针
3、a是一个数组长度为10,数组元素为10个指向整型变量的指针的数组
七、数组指针
本质是指针,此时指针指向的的地址是数组的首地址
int (*a)[10];
a是一个指向地址是一个数组长度为10,数组元素为整型变量的整型数组的首地址的指针
八、指针函数
本质是函数,返回类型是指针的函数
int *f(int b);
int num = 1;
int *ptr = NULL;
ptr = f(num);
只有函数名,表示函数的入口地址;如果函数名后带(),则表示调用该函数
f是一个返回类型是整型指针,函数参数为整型的函数
九、函数指针
本质是指针,该指针变量指向的是函数入口地址
int (*f)(int b);//声明一个函数指针
int g(int b);//声明一个普通函数
f = g;//把函数g的首地址赋值给f(也可以写成 f = &g, 取地址运算符&不是必需的)
int sum = 0;
sum = f(1);//调用函数
sum = (*f)(1);//调用函数
两种调用都可以
f是指向一个函数参数是整型变量,返回类型是整型变量的函数入口地址的指针
十、指针常量与常量指针识别技巧
const在*的右边就是常量指针,在*的左边就是指针常量
十一、指针常量
地址不变
本质是常量,就和整型常量、字符常量等一样,变量的存的值声明赋值以后,就不能改变。
我们知道指针变量存的值是地址,也就是说这个指针变量不能改变它的指向地址。
int *const p
十二、常量指针
地址存的值不变
本质是指针,此时指针指向的值是常量
const int *p;
int const *p;