软件编程
位置:首页>> 软件编程>> C语言>> C语言一级指针二级指针和 * 指针区别及使用详解

C语言一级指针二级指针和 * 指针区别及使用详解

作者:前端跑起来  发布时间:2022-10-21 03:29:34 

标签:C语言,一级指针,二级指针, , 指针

C语言一级指针二级指针和 * 指针区别及使用详解

1.一级指针

#include?<stdio.h>
int?main(){
?int?data?=?10;
?int?*p1?=?&data;?//?p1?=?&data
?printf("data的地址是:%p\n",?&data);
?printf("p1指针变量地址是:%d,内容是%d\n",?p1,?*p1);
?//?通过指针修改变量值
?printf("\n");
?*p1?=?20;
?printf("data=%d,?*p1=%d\n",?data,?*p1);
?return?0;
}

运行结果如下:

data的地址是:00AFFB18

p保存的data的地址是:11533080,内容是10

data=20, *p1=20

一级指针的用法其实是取数据的地址,以此类推,二级指针就是取一级指针的地址,也可以表示一级指针的指向的内容。

2.二级指针

指针变量也是一种变量,也会占用存储空间,也可以使用&获取它的地址。C语言不限制指针的级数,每增加一级指针,在定义指针变量时就得增加一个星号*。p1是一级指针,指向普通类型的数据,定义时只有一个*;p2是二级指针,指向一级指针p1,定义时需要两个*。

它们关系如下所示:

C语言一级指针二级指针和 * 指针区别及使用详解

上图关系所示:data是int类型变量,p1是指向data的指针变量,p2又是指向p1的指针变量。

假设a、p1、p2、p3的地址分别为0x00A0、0x0010、0x0020、0x0030。它们之间的关系可以用下图描述:

C语言一级指针二级指针和 * 指针区别及使用详解

根据上图描述的逻辑,代码表示如下:

#include?<stdio.h>
int?main(){
?int?data?=?10;
?int?*p1?=?&data;
?int?**p2?=?&p1;
?printf("%d,?%d,?%d\n",?data,?*p1,?**p2);
?printf("&p1=%#X,?p2=%#X\n",?&p1,?p2);?//?p1的地址为p2的值
?printf("&data=%#X,?p1=%#X\n",?&data,?p1);?//?data的地址为p1的值
?return?0;
}

运行结果如下所示:

10, 10, 10

&p1=0X12FFE94, p2=0X12FFE94

&data=0X12FFEA0, p1=0X12FFEA0

**p2等价于(*(*p2)),

3. * 指针

以此类推,一级指针加一个*,二级指针增加两个*, * 指针增加三个*。

我们可以先用图去梳理指针之间的关系:

C语言一级指针二级指针和 * 指针区别及使用详解

假设a、p1、p2、p3的地址分别为0x00A0、0x0010、0x0020、0x0030。它们之间的关系可以用下图描述:

C语言一级指针二级指针和 * 指针区别及使用详解

根据上图描述的逻辑,代码表示如下:

#include?<stdio.h>
int?main(){
?int?a?=?100;
?int?*p1?=?&a;
?int?**p2?=?&p1;
?int?***p3?=?&p2;
?printf("%d,?%d,?%d,?%d\n",?a,?*p1,?**p2,?***p3);
?printf("&p2?=?%#X,?p3?=?%#X\n",?&p2,?p3);
?printf("&p1?=?%#X,?p2?=?%#X,?*p3?=?%#X\n",?&p1,?p2,?*p3);
?printf("?&a?=?%#X,?p1?=?%#X,?*p2?=?%#X,?**p3?=?%#X\n",?&a,?p1,?*p2,?**p3);
?return?0;
}

100, 100, 100, 100

&p2 = 0XC2FB7C, p3 = 0XC2FB7C

&p1 = 0XC2FB88, p2 = 0XC2FB88, *p3 = 0XC2FB88

&a = 0XC2FB94, p1 = 0XC2FB94, *p2 = 0XC2FB94, **p3 = 0XC2FB94

以 * 指针 p3 为例来分析上面的代码。***p3等价于*(*(*p3))。*p3 得到的是 p2 的值,也即 p1 的地址;*(*p3) 得到的是 p1 的值,也即 a 的地址;经过三次操作后,*(*(*p3)) 得到的是 a 的值。

来源:https://z6r.cn/jPJow6

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com