C语言-二级指针的思考

背景:

在学习uC/os ii源码时,遇到了关于二级指针这样的例子,当时自己想了好久,现在分享出来供大家参考。

void *addr;
void **plink;
addr = &ADDR;
-------------------------------
plink = (void **)addr;  
    pblk  = (INT8U *)((INT32U)addr + blksize);
    for (i = 0; i < (nblks - 1); i++) {
       *plink = (void *)pblk;  
        plink = (void **)pblk;                         
        pblk  = (INT8U *)((INT32U)pblk + blksize);   
    }
    *plink              = (void *)0;                 

分析上述程序:

首先plink是一个二级指针,plink=(void **) addr,addr是一级指针,需要注意的是(void **)addr的值是addr的值,也就是ADDR的地址。(void **)addr和(void )addr是一个值,此时,可以暂时理解为plink和plink指向同一个区域。
*plink=(void )pblk, 改变的是plink的指向,*plink指向了pblk的区域,此时plink还没有改变指向。plink = (void **)pblk,到这里才改变的是plink的指向。

之前遇到二级指针用法都是这样的:

void a;void *b;void **ptr;
b = &a; ptr = &b;

而这个例子中最难理解的地方在于plink = (void **)addr,plink是一个二级指针,addr是一个一级指针,强制类型转换后,plink到底指向哪里,plink的值又是什么,是非常疑惑的。我个人的理解是,因为addr是一级指针,二级指针plink兼容一级指针addr,这个时候plink当成一级指针来用。plink等于addr,**plink就会报错。但是本质还是二级指针,所以plink被赋值为(void *)pblk的时候,*plink的值还是会发生变化改变指向。

附上个人验证的程序

/*********************************************************************
 * Author           : liu
 * Last modified    : 2023-05-16 18:26
 * Filename         : main.c
 * Description      : 
 * ******************************************************************/
#include "stdio.h"
int main(){

  int *a;
  int *c;
  int b;
  int d;
  int **ptr;
  b = 321;
  d = 123;
  c = &d;
  a = &b;
  printf("&a %x\n", &a);
  printf("a %x\n", a);
  printf("(int *)a %x\n", (int *)a);
  printf("(int **)a %x\n", (int **)a);

  printf("a addr %x\n", a);
  printf("c addr %x\n", c);
  printf("b addr %x\n", &b);
  printf("d addr %x\n", &d);

  ptr = (int **)a;

  printf("ptr %x\n", ptr);
  printf("*ptr %x\n", *ptr);
  //printf("**ptr %x\n", **ptr);

  *ptr = (int *)c;
  printf("*ptr = (int *)c\n");
  printf("ptr %x\n", ptr);
  printf("*ptr %x\n", *ptr);
  printf("**ptr %x\n", **ptr);

  ptr = (int **)c;
  printf("ptr %x\n", ptr);
  printf("*ptr %x\n", *ptr);

  return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值