C语言的指针数组以及二级指针

 指针数组

指针数组是一个数组,其中的每个元素都是指针类型。这意味着每个元素可以指向一个不同的内存位置。指针数组的作用是方便地管理多个指针,每个指针可以指向不同的数据类型或者相同的数据类型。指针数组比较适合用来存储一组指针,每个指针可以指向一个独立的数据对象。这在处理多个相关的指针时非常有用。

  1. 首先,我们定义一个整数指针数组 int *arr[3],它包含了3个整数指针。这些指针可以指向不同的整数变量。

  2. 现在,我们创建一些整数变量:

    int num1 = 10;
    int num2 = 20;
    int num3 = 30;
    
  3. 接下来,我们将这些整数指针指向这些整数变量:

    arr[0] = &num1; // 第一个指针指向 num1
    arr[1] = &num2; // 第二个指针指向 num2
    arr[2] = &num3; // 第三个指针指向 num3
    
  4. 现在,我们可以通过遍历数组来访问每个指针所指向的数据。例如:

    for (int i = 0; i < 3; i++) {
        printf("arr[%d] points to value: %d\n", i, *arr[i]);
    }
    

    这段代码会输出:

    arr[0] points to value: 10
    arr[1] points to value: 20
    arr[2] points to value: 30
  • 指针数组是一个数组,其中的每个元素都是指针类型。每个指针可以指向不同的内存位置。
  • 在这个例子中,我们创建了一个整数指针数组 int *arr[3],其中包含了3个整数指针。
  • 我们将这些指针分别指向了不同的整数变量(num1num2num3)。
  • 通过遍历数组,我们可以访问每个指针所指向的数据,从而实现了对不同整数变量的管理。

指针的指针 

指针的指针,也叫做二级指针。

  1. 首先,我们知道指针是一个变量,它存储了一个内存地址。这个地址指向了某个数据的位置。比如,我可以定义一个整数指针 int *ptr,它可以指向一个整数变量的内存地址。

  2. 现在,指针的指针就是一个指针,它指向了另一个指针的内存地址。这个另一个指针,也就是被指向的指针,它自己又可以指向某个数据的位置。所以,指针的指针实际上是一个指向指针的指针变量

  3. 为什么我们需要指针的指针呢?有时候,我们需要在函数中修改指针的值。但是,如果我们只传递一个普通的指针作为参数,函数内部修改它的值并不会影响到外部的指针。这时,我们可以使用指针的指针。

  4. 让我们看一个例子。假设我们有一个整数指针 int *ptr1,它指向了一个整数变量。现在,我们还有一个指向 ptr1 的指针,叫做 int **ptr2。这就是一个指针的指针。

  5. 如果我们在函数中传递了 ptr2,并在函数内部修改了它指向的 ptr1 的值,那么外部的 ptr1 也会被修改。这样,我们就可以通过指针的指针来实现对外部指针的修改

#include <stdio.h>

int main() {
    int num = 42; // 一个整数变量
    int *ptr1 = # // 指向整数的指针
    int **ptr2 = &ptr1; // 指向指针的指针
    // 修改 num 的值
    *ptr1 = 100;
    // 修改 ptr1 的值,让它指向另一个整数变量
    int another_num = 200;
    ptr1 = &another_num;
    // 通过 ptr2 间接修改 num 的值
    **ptr2 = 300;
    // 打印结果
    printf("num = %d\n", num); // 应该是 300
    printf("another_num = %d\n", another_num); // 应该是 200

    return 0;}

 在这个代码中,我们定义了一个整数变量 num,一个整数指针 ptr1,和一个指针的指针 ptr2。我们通过 ptr1 和 ptr2 来修改 num 的值,展示了指针的指针的作用。

补充:

  1. 一级指针:一级指针其实就是我们平时常见的普通指针。例如,我们可以定义一个整数指针 int *ptr1,它可以指向一个整数变量的内存地址。

  2. 二级指针:二级指针是指向一级指针的指针。也就是说,如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针。例如:

    int a = 12;
    int *b = &a; // 一级指针
    int **c = &b; // 二级指针,指针c指向的是指针b,也就是说二级指针c存储的是一级指针b的地址。
    
  3. 三级指针:三级指针是指向二级指针的指针。规律是,n级指针就是指向n-1级指针的指针。例如:

    int a = 12;
    int *b = &a; // 一级指针
    int **c = &b; // 二级指针,指针c指向的是指针b的地址
    int ***d = &c; // 三级指针,指针d指向的是指针c的地址
    

    因此,如果我们在三级指针前面加一个取地址运算符 &d,那么取出的是其自身的存储地址。而 *d 则是取到指针c的地址,**d 则是取到指针b的地址,***d 则是取到a地址上的数据。

  • 23
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值