C语言之二重指针

本文介绍了C语言中的二重指针概念,包括其表示方式和使用场景。二重指针可以指向一重指针的地址、指针数组的地址,常见于函数参数传递以改变外部指针变量。示例代码展示了二重指针的基本用法、指向指针数组以及如何通过函数改变指针地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二重指针的C语言表示:int  **p,它表示指针的指针,二重指针其实就是指针数组指针。

二重指针一般用的场合:

(1)二重指针指向一重指针的地址。

(2)二重指针指向指针数组的地址。

(3)实践中二重指针用得比较少,大多数都是和指针数组一起用的。

(4)实际编程时有时在函数传参时,为了通过函数内部改变外部的指针变量,通常用二重指针。

举例:

/***********************************二重指针基本用法*********************************************/

#include<stdio.h>

int main()

{

int a = 10;

int *P1;

int **P2;

P1 = &a;

P2 = &P1;

return 0;

}

/**********************************二重指针指向指针数组*****************************************/

#include<stdio.h>

int main()

{

### C语言中使用二重指针操作头结点 在C语言中,使用二重指针(即指向指针指针)来操作链表的头结点是一种常见的技巧。这种方法可以简化函数调用时传递参数的方式,并允许直接修改外部变量所指向的内容。 #### 双指针处理头结点的优点 通过使用二重指针,可以在不返回新头结点的情况下,在函数内部直接改变头结点的位置或状态。这种方式特别适用于动态内存分配场景下的链表操作,比如插入、删除等。 #### 示例代码:双指针实现头插法创建单链表 以下是利用二重指针实现头插法的一个简单例子: ```c #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node* next; } Node; void insertAtHead(Node** pphead, int value) { // 动态分配新的节点空间 Node* newNode = (Node*)malloc(sizeof(Node)); if (!newNode) { fprintf(stderr, "Memory allocation failed\n"); exit(EXIT_FAILURE); } newNode->data = value; // 设置数据域 newNode->next = *pphead; // 新节点的下一个节点是指向原来的头节点 *pphead = newNode; // 修改头指针为新节点地址 } // 打印链表内容 void printList(Node* head) { while (head != NULL) { printf("%d -> ", head->data); head = head->next; } printf("NULL\n"); } int main() { Node* head = NULL; // 初始化为空链表 // 插入几个节点到头部 insertAtHead(&head, 30); // 注意这里传的是 &head 即二重指针 insertAtHead(&head, 20); insertAtHead(&head, 10); // 输出链表 printList(head); return 0; } ``` 上述程序展示了如何使用二重指针 `pphead` 来管理链表头结点的变化过程[^6]。每当执行一次 `insertAtHead()` 函数调用后,实际的头结点都会被更新成最新加入的那个节点。 #### 解析 - **定义结构体**: 定义了一个简单的链表节点类型 `Node`, 包含整型成员 `data` 和指向下一节点的指针 `next`. - **头插方法**: 创建一个新的节点并将它设置为首节点之前的所有工作都在此完成. - **打印功能**: 遍历整个列表并逐项显示其值. 这种技术不仅限于单链表;对于更复杂的结构如双向链表或者循环链表同样适用[^7]. ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值