blj28

导航

函数形参中指针的指针作用

函数形参中指针的指针作用

在 C/C++ 编程中,函数形参中的 指针的指针(即 **)通常用于以下场景:


1. 修改指针本身

  • 当需要在函数内部修改传入的指针变量时,使用指针的指针。
  • 普通指针作为参数只能修改指针指向的内容,而不能修改指针本身的值。

示例:

c
void allocateMemory(int **ptr) {
    *ptr = (int *)malloc(sizeof(int)); // 修改指针本身
    **ptr = 42;                       // 修改指针指向的内容
}

int main() {
    int *p = NULL;
    allocateMemory(&p); // 传入指针的地址
    printf("%d\n", *p); // 输出 42
    free(p);
    return 0;
}

在这个例子中,allocateMemory 函数通过指针的指针修改了 p 的值,使其指向一块动态分配的内存。


2. 处理多维数组或复杂数据结构

  • 指针的指针常用于表示二维或多维数组,或者处理复杂的嵌套数据结构。

示例:动态分配二维数组

c
void create2DArray(int **array, int rows, int cols) {
    array = (int **)malloc(rows * sizeof(int *));
    for (int i = 0; i < rows; i++) {
        array[i] = (int *)malloc(cols * sizeof(int));
    }
}

int main() {
    int **arr = NULL;
    create2DArray(arr, 3, 3);
    // 使用 arr...
    // 释放内存...
    return 0;
}

3. 实现链表、树等数据结构的操作

  • 在链表、树等数据结构中,指针的指针常用于插入、删除节点等操作,以便直接修改指针的指向。

示例:链表插入节点

 
c
typedef struct Node {
    int data;
    struct Node *next;
} Node;
//使用头插法插入节点时,每次插入的新节点都会成为链表的第一个节点。 void insertNode(Node **head, int value) { Node *newNode = (Node *)malloc(sizeof(Node)); newNode->data = value; newNode->next = *head;// 新节点的 next 指向当前头节点 *head = newNode; // 再修改头指针 更新头节点为新节点 } int main() { Node *list = NULL; insertNode(&list, 10); insertNode(&list, 20); // list 现在包含两个节点:20 -> 10 return 0; }

4. 返回多个值

  • 指针的指针可以用来返回多个值,尤其是当函数需要返回多个指针时。

示例:

c
void getTwoValues(int **a, int **b) {
    *a = (int *)malloc(sizeof(int));
    *b = (int *)malloc(sizeof(int));
    **a = 100;
    **b = 200;
}

int main() {
    int *x = NULL, *y = NULL;
    getTwoValues(&x, &y);
    printf("x = %d, y = %d\n", *x, *y); // 输出 x = 100, y = 200
    free(x);
    free(y);
    return 0;
}

 

posted on 2025-06-18 13:21  bailinjun  阅读(18)  评论(0)    收藏  举报