对指针和二重指针的理解

在复习数据结构,创建单链表以及做链表的一些基本操作的时候,遇到需要使用二重指针的情况,刚开机的大脑对于这个东西已经十分混乱了,于是做了一个小test来理解二重指针的相关概念。

测试代码如下:

#include <stdio.h>

int main(){
	int a = 5;
	int *pa = &a;
	int **ppa = &pa;
	int *pb = &pa;
	printf("%d\n",a);
	printf("%d\n",pa);
	printf("%d\n",ppa);
	printf("%d\n",*pa);
	printf("%d\n",**ppa);
	printf("%d\n",*pb);
	return 0;
}

测结果如下:
在这里插入图片描述

在这里插入图片描述
简单说一下:声明了4个变量,那么其中pa,pb是一重指针变量,ppa是二重指针变量。
对于指针,我们关注四方面的内容:指针的类型、指针所指向的类型、指针的值(指针指向的内存区)、指针本身所占据的内存区(指针的地址)。
由于对二重指针的使用并不是很深入,我只是做一个简单的小test加以理解二重指针的概念,这里对于指针的类型和指针所指向的类型的区分并没有做详细的说明,但是其实这是两个概念,是精通指针的关键点之一,感兴趣的朋友可以自己去看一些其他也许解释的更深刻的博文,或者自己做一个更细致的test。

  • 指针的类型:
      int * pa --> int *
      int ** ppa --> int **
  • 指针所指向的类型:
      int * pa --> int
      int ** ppa --> int *
      当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待
  • 指针的值:
      pa–>6487564
      ppa–>6487552
      pb–>6487552
  • 指针本身所占据的内存区
    指针本身占了多大的内存?你只要用函数sizeof(指针的类型)测一下就知道了。在 32 位平台里,指针本身占据了 4 个字节的长度。指针本身占据的内存这个概念在判断一个指针表达式是否是左值时很有用。

理解:
①变量储存值
②指针变量的值:指针变量本身存储的数值。如输出的pa,ppa
③指针:变量的值是一个地址,这个地址指向另一个内存区。
④运算符:&和*
  &:取地址符
  *:间接运算符 *p–>p所指向的东西
在这里插入图片描述
说白了,指针变量装的是地址,二重指针装的就是指针。
pa=另一个指针 改变了pa所指向的区域,pa指向了新的区域
*pa= xxx 改变了pa所指向的区域的值

ppa=另一个二重指针 改变了ppa所指向的区域,这些区域存放的值依然是地址值
*ppa=另一个地址 改变了一重指针的指向区域,也就是说,ppa的值不变,改变了ppa存放的指针的指向。

在我的使用场景里也就是单链表有关的相关操作,声明了一个指针型的变量LinkList L,这个时候这个L指向一个未知的区域,在初始化操作InitList中,让L指向NULL,意味着这是一个空表。
那么要想在函数InitList中改变L的指向(指针变量L的值),我们要传入L的地址,函数InitList接受这个实参的形参就需要是一个二重指针(存放指针L的地址),之后做*L=另一个地址。

仅供参考。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值