二级指针
我们先定义一个二级指针
int a=1911;
int* p1=&a;
int** p2=&p1;
可以看到二级指针在初始化时也和一级指针p1别无二致,都是系统给指针分配一个内存地址,然后将指向变量的地址赋给指针(将变量的地址存放到本身的内存空间里)
在此,我们可以知道
&p2=0X4040//p2指针所在的地址
p2=0X3030//p2存放的值,也是p2所指向的地址,也就是p1的地址
*p2=0X2020//p2所指向的地址所存放的值,也就是p1的值
**p2=1911//p2所指向的地址所存放的值,根据这个值再度找到相应的的地址所存放的值
二级指针的应用
二级指针可以应用于单链表的删除中
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int data;
struct Node* next;
}*LinkList;
void deleteNode(Node** head, int value)
{
Node** p = head;//(*p)表示头结点
for (; (*p) != NULL;p=p->next)
{
if ((*p)->data == value)
{
(*p) = (*p)->next;
}
}
}
void createLink(Node* head)
{
for (int i = 0; i < 5; i++)//头插法
{
Node* p = (Node*)malloc(sizeof(Node));
scanf_s("%d", &p->data);
p->next = head->next;
head->next = p;
}
}
int main()
{
LinkList head = (LinkList)malloc(sizeof(Node));//初始化链表
head->next = NULL;
createLink(head);
Node* test = head->next;
for (; test!=NULL; test=test->next)
{
printf("%d ", test->data);
}
printf("\n");
int value;
printf("要删除的结点:");
scanf_s("%d", &value);
deleteNode(&head, value);
test = head->next;
for (; test != NULL; test = test->next)
{
printf("%d ", test->data);
}
printf("\n");
}
测试结果