函数形参中指针的指针作用
函数形参中指针的指针作用
在 C/C++ 编程中,函数形参中的 指针的指针(即 **
)通常用于以下场景:
1. 修改指针本身
- 当需要在函数内部修改传入的指针变量时,使用指针的指针。
- 普通指针作为参数只能修改指针指向的内容,而不能修改指针本身的值。
示例:
c
*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;
}