本文参考视频: https://b23.tv/xLOG6SV,相当于学习笔记,这样概念混淆的时候也可以看看。
一.一级指针
以下图表示的意思是:
a的地址为0XA0,定义一个指针p,指向a的地址,计算机也会给p一个内存空间&p:0XB0
图中:p=0XA0,&p=0XB0,*p=3
来看代码:
#include<stdio.h>
void test(int *p1){
*p1=114514;
}
int main()
{
int *p1=NULL;
int p=2333;
p1=&p;
printf("*p1=%d,p1=%d,&p1=%d,&(*p1)=%d,\np=%d,&p=%d\n",*p1,p1,&p1,&(*p1),p,&p);
test(p1);
printf("*p1=%d,p1=%d,&p1=%d,&(*p1)=%d,\np=%d,&p=%d\n",*p1,p1,&p1,&(*p1),p,&p);
getchar();
return 0;
}
得到的结果一个一个看:
*p1=p这个变量的值
p1=p的内存地址,即(p1=&p)
&p1=计算机给p1的内存地址
&(*p1)=(*p1)这个变量的内容的地址,所以我们得到&(*p1)=&p=p1,多画图理解下就不难了。
二.二级指针(**p)
按照之前一级指针的说法,*p存放的是一级指针的地址,**p存放的就是*p的地址
以此类推***p存放的就是比他第一级指针的地址:用图理解下:
&p1=0xc0(计算机给p1分配的地址)
p1=&p=0xb0(一级指针自身的地址)
*p1=0xa0(相当于对p1所指向的地址(0xb0)进行解析,我们找到(0xb0),发现他代表的是p的地址,而p指针所指向的是地址是(0xa0) )
注意区别:p1本身的地址和p1所指向的地址
**p1=3(同理,继续解析,得到变量a的值为3),不难发现:**p1=*p
来看代码:
#include<stdio.h>
void test2(int **p){
printf("**p2=%d,&(*p2)=%d,*p2=%d,p2=%d,&p2=%d\n",**p,&(*p),*p,p,&p);
}
int main(){
int *p1=NULL;
int p=114514;
p1=&p;
printf("*p1=%d,p1=%d,&p1=%d,&(*p1)=%d\n",*p1,p1,&p1,&(*p1));
test2(&p1);
getchar();
return 0;
}
结果:
其中p2代表二级指针,p1代表一级指针
●p2=&p1(p2=p1的地址)
●*p2=p1
●**p2=*p1
我们可以看到p2对p1的逐步解析(从p1的地址>到p1所指的地址>p1所指的地址的内容)
●&p2代表计算机给p2分配的地址
●&(*p2)=p2=&p1
指针确实较难理解,学习时多画图多分析