菜鸟教程 -- 学的不仅是技术,更是梦想!

C 教程
(追記) (追記ここまで)

C 指向指针的指针

C 指针 C 指针

指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。

C 中指向指针的指针

一个指向指针的指针变量必须如下声明,即在变量名前放置两个星号。例如,下面声明了一个指向 int 类型指针的指针:

int **var;

当一个目标值被一个指针间接指向到另一个指针时,访问这个值需要使用两个星号运算符,如下面实例所示:

实例

#include<stdio.h>intmain(){intV; int *Pt1; int **Pt2; V = 100; /* 获取 V 的地址 */Pt1 = &V; /* 使用运算符 & 获取 Pt1 的地址 */Pt2 = &Pt1; /* 使用 pptr 获取值 */printf("var = %d\n", V); printf("Pt1 = %p\n", Pt1); printf("*Pt1 = %d\n", *Pt1); printf("Pt2 = %p\n", Pt2); printf("**Pt2 = %d\n", **Pt2); return0; }

当上面的代码被编译和执行时,它会产生下列结果:

var = 100
Pt1 = 0x7ffee2d5e8d8
*Pt1 = 100
Pt2 = 0x7ffee2d5e8d0
**Pt2 = 100

C 指针 C 指针

AI 思考中...

2 篇笔记 写笔记

  1. #0

    菜鸟lean

    135***[email protected]

    434

    指针更像是一个找地址开门取物品的操作。其中 * 就是这个动作重复的次数,ptr 是取东西的门牌号也就是地址值:

    • *ptr 是完成一次开门取东西操作最终取出来的东西。
    • **ptr 是完成两次开门取物.需要注意的是第一次取得的是第二次要开的门的门牌号或者说地址,然后根据门牌号继续开门取物。 所以 *ptr 或者 **ptr 一定是取出来的东西,即为数值。而 ptr 一定是门牌号,即为地址值。

    菜鸟lean

    135***[email protected]

    3年前 (2023年03月04日)
  2. #0

    Zhiqian Chen

    che***[email protected]

    44

    int **arr 也可以理解为一个二维数组的动态表示。它通常用于创建动态分配的二维数组,允许在运行时根据需要分配和管理内存。步骤如下:

    1. 分配行指针数组:首先,分配一个指针数组,其中每个元素指向一行的整数数组。
    2. 为每一行分配内存:接着,为每一行分配一个整数数组。

    示例:

    #include <stdio.h>
    #include <stdlib.h>
    int main() {
     int rows = 3, cols = 4;
     // Step 1: 分配行指针数组
     int **arr = (int **)malloc(rows * sizeof(int *));
     
     // Step 2: 为每一行分配内存
     for (int i = 0; i < rows; i++) {
     arr[i] = (int *)malloc(cols * sizeof(int));
     }
     // 填充数组
     for (int i = 0; i < rows; i++) {
     for (int j = 0; j < cols; j++) {
     arr[i][j] = i * cols + j + 1; // 填充示例数据
     }
     }
     // 打印数组
     for (int i = 0; i < rows; i++) {
     for (int j = 0; j < cols; j++) {
     printf("%d ", arr[i][j]);
     }
     printf("\n");
     }
     // 释放内存
     for (int i = 0; i < rows; i++) {
     free(arr[i]); // 释放每一行的内存
     }
     free(arr); // 释放行指针数组
     return 0;
    }

    优点:

    • 使用 malloc 动态分配内存,可根据需要调整数组的大小。
    • 可创建任意大小的二维数组,不需要在编译时确定数组的大小。

    注意:使用完动态分配的内存后,必须使用 free 释放,以防止内存泄漏。

    Zhiqian Chen

    che***[email protected]

    2年前 (2024年10月28日)

点我分享笔记

  • 昵称 (必填)
  • 邮箱 (必填)
  • 引用地址

AltStyle によって変換されたページ (->オリジナル) /