C语言指针讲解(适用于初学者)

本文参考视频: https://b23.tv/xLOG6SV,相当于学习笔记,这样概念混淆的时候也可以看看。

一.一级指针

以下图表示的意思是:

a的地址为0XA0,定义一个指针p,指向a的地址,计算机也会给p一个内存空间&p:0XB0

C语言指针讲解(适用于初学者)_第1张图片

图中:p=0XA0,&p=0XB0,*p=3

来看代码:

#include
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;
}

 得到的结果一个一个看:

C语言指针讲解(适用于初学者)_第2张图片

*p1=p这个变量的值

p1=p的内存地址,即(p1=&p)

&p1=计算机给p1的内存地址

&(*p1)=(*p1)这个变量的内容的地址,所以我们得到&(*p1)=&p=p1,多画图理解下就不难了。

二.二级指针(**p)

按照之前一级指针的说法,*p存放的是一级指针的地址,**p存放的就是*p的地址

以此类推***p存放的就是比他第一级指针的地址:用图理解下:
C语言指针讲解(适用于初学者)_第3张图片

 &p1=0xc0(计算机给p1分配的地址)

p1=&p=0xb0(一级指针自身的地址)

*p1=0xa0(相当于对p1所指向的地址(0xb0)进行解析,我们找到(0xb0),发现他代表的是p的地址,而p指针所指向的是地址是(0xa0) )

注意区别:p1本身的地址和p1所指向的地址

**p1=3(同理,继续解析,得到变量a的值为3),不难发现:**p1=*p

来看代码:

#include
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

指针确实较难理解,学习时多画图多分析

你可能感兴趣的:(c语言入门,c语言,开发语言)