前言
指针这个环节一直是我不敢写的一个部分,因为他实在太重要,C语言的优点基本都是因为指针所诞生的。
变量与地址
我们可以把计算的存储理解成一个教室,每一个教师都能进学生,而且教师也有着门牌号
所以我们就可以就可以将变量看成上面的学生,而门牌号就是其中的地址。
再比如,int a =0;
在这个里面a就是变量,&a就是他存放的地址
其实指针就是地址,它指向一个房间号
以我现在的理解就是,在系统中,每一个物理内存都有它的编号,也就是地址,这样就方便系统去调用,同样的也有着不同的存储分区
指针和指针变量
我们经常说到指针就是地址,地址就是一个常量,是不可改变
但是我们又经常的说到把指针值向谁,这里的指的就是指针变量
什么意思呢,上面图中0x158黑色的外壳就是我们通常说的指针,他是不会变化的,是固定的地址,不过他里面存放的是另外一片空间的地址,存放的是哪里的地址,他就指向哪里,图中的0f113就是指针变量,他指向了一个地址
直接访问与间接访问
我们先举一个例子,这时候我们就获得了以下的关系图
int i =1;
int *p =&i; //建立一个指针指向i,也就是将 i 的地址赋值给 p
他们就获得了这样的一个关系,i在栈区申请到一片空间,获得了地址,并为他赋值1,然后创建了一个指针,用他的指针变量存储 i 的地址,这样 p 就指向了i。
直接访问就是可以进行 i=10;这样直接进行赋值操作
间接访问就是可以可以通过间接访问符 * 来来间接的通过指针来访问, *i = 10
如果再有一个指针,他就可以指向p的地址,这样就是构成了二级访问
二级指针与多级指针
二级指针其实就和一级指针一样,原理是一样的,就是多了一层引用,以二级指针为例子
int i =1;
int *p =&i; //建立一个指针指向i,也就是将 i 的地址赋值给
int **pi = &p; //将新的指针指向原来指针的地址,构成二级指针
这时候,pi又创建了一份空间,他里面存的是指针p的地址
所以 对pi进行访问就是p的地址 *pi == p
对 pi进行两层访问就就是i的值 **p== i == *p
他们都是等价的,所以二级指针和多级指针就是多层的调用关系
指针的大小和类型
指针的大小 指针的大小取决于机器的位数,64位的就是8个字节,32位的就是4个字节
在int * p=&a;中他的类型是 int * 变量名是p,&a是地址,而且要去后面的地址是一个合法的地址,要有明确的指定
空指针和野指针
空指针:int *pa =NULL;
这其中就NULL是系统的一个宏,它指向系统地址的0号位置,他不允许任何人修改,所以当有人去访问的时候,编译器都会报段错误,是一种放错的手段
野指针:就是不知道指向何处的指针
指针数组
就是用一个指针去指向数组的首地址
int a[2]={1,2};
int *p = a;
这样就可以去做类似于数组的运算
就比如 a =p a[2]=*(p+2)
p+2=&a[2]
数组指针
储存类型 数据类型 * 数组名 【长度】
int * arr [3] 也就是存储了3个指针
char *arr = ["sss","ccc","sdsd"];
for (int i=0;i<3,i++)
{
printf ("%s ",arr[3]);
}
这样就可以用数组指针来获得三个字符串