指针的运用(3)

 保持空杯心态,在了解的基础上明白,继而熟悉,终于熟练。

今天分享一个多级指针的例子,看你有没有被绕晕?

题目:三级指针传递和修改
问题:定义一个函数 modifyValue,接受一个三级指针(int ***),并将所指向的值修改为 100。在 main 函数中测试这个函数。

示例代码:

#include <stdio.h>
#include <stdlib.h>

void modifyValue(int ***ptr) 
{
    ***ptr = 100; // 直接修改所指向的值
}

int main(void) 
{
    int value = 42;
    int *p = &value;
    int **pp = &p;

    printf("Before modification: %d\n", value);

    modifyValue();这个位置该传入什么呢?才能满足题意

    printf("After modification: %d\n", value);

    return 0;
}

函数括号里面应该传入什么呢?

modifyValue 中,ptr int *** 类型的指针。这意味着:

  • *ptr 是一个 int ** 类型的指针(即 pp)。
  • **ptr 是一个 int * 类型的指针(即 p)。
  • ***ptr 是一个 int 类型的值(即 value)。

调用 modifyValue 函数

要理解正确的调用方式是 modifyValue(&p);,我们需要知道 modifyValue 的参数类型和你传递的实参的关系。

  1. modifyValue(&p); 解析:

    • &pint ** 类型的地址,即 pp 的地址。
    • 传递 &pmodifyValue,这样 ptrmodifyValue 中指向 int ** 类型的指针(即 pp)。
    • modifyValue 中,*ptr 解引用得到 p**ptr 解引用得到 value。因此,***ptr 实际上是 value,可以直接修改它。
  2. 错误的调用方式 modifyValue(&pp);:

    • &ppint *** 类型的地址。将 &pp 传递给 modifyValueptrmodifyValue 中指向 int *** 类型的指针。
    • modifyValue 中,*ptr 解引用得到 pp**ptr 解引用得到 p,而 ***ptr 也会得到 value,但这不是你真正意图的修改,因为 &pp 是一个不适合此函数的实参。

    3.为什么&pp 是 int *** 类型的地址?

    &ppint *** 类型的地址,因为 pp 本身是 int ** 类型的变量。让我们详细拆解一下:

  1. 变量 pp 的类型:

    • ppint ** 类型的指针,指向 int * 类型的指针(即 p)。
  2. 取地址操作:

    • &pp 是取 pp 变量的地址。
    • &pp 的类型是 int ***,因为 ppint ** 类型的变量,所以 &pp 是一个指向 int ** 的指针,也就是 int *** 类型的指针。

类型总结

  • pp 的类型是 int **
  • &pp 的类型是 int ***,这是因为 &pppp 的地址,ppint ** 类型。

 4.为什么pp 是 int ** 类型的指针,指向 int * 类型的指针?

    • value 是一个 int 类型的变量。
    • p 是一个指向 int 的指针,即 int *
    • pp 是一个指向 int * 的指针,即 int **
  1. 指针的层次

    • p 存储了 value 的地址,所以 p 是一个 int * 类型的指针。
    • pp 存储了 p 的地址,所以 pp 是一个 int ** 类型的指针。

理解 pp 的类型

  • p 的类型pint *,它保存了 value 的地址。也就是说,p 指向一个 int 类型的值。

  • pp 的类型ppint **。它保存了 p 的地址。由于 pint * 类型,所以 pp 是一个 int ** 类型的指针。这个类型的指针指向另一个指针,即 int *

总结

  • ppint ** 类型的指针,因为它指向一个 int * 类型的指针(即 p)。
  • pp 的内容是 p 的地址,而 pint * 类型的,因此 pp 指向一个 int * 类型的地址。

这个多级指针的层次关系是这样构成的:

  • pppvalue

因此,ppint ** 类型,它指向 int * 类型的指针(即 p)。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李解49

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值