二级指针(一)
一切尽在code中:
#include <stdio.h> #include <stdlib.h> /*测试通过二级指针删除链表元素*/ struct TEST { struct TEST *next; int a; }; struct TEST *h; static int add_list(struct TEST *test) { if (test == NULL) return -1; test->next = h; h = test; return 0; } int main(int argc, char *argv[]) { struct TEST **tmp; struct TEST test_1, test_2, test_3; test_1.a = 1; test_2.a = 2; test_3.a = 3; add_list(&test_1); #if 0 add_list(&test_2); add_list(&test_3); #endif /*二级指针相对于指针具有相同的访问能力*/ /* * 刚开始时候判断了*tmp不为NULL,所以 (*tmp)->next 一定是存在的 * 此处操作没什么问题 */ for (tmp = &h; *tmp; tmp = &(*tmp)->next) { printf("%d ", (*tmp)->a); } printf("\n"); /*二级指针相对于指针,增加了修改指针变量的能力*/ for (tmp = &h; *tmp != NULL; tmp = &(*tmp)->next) { if ((*tmp)->a == 1) { /* * 由于此处的删除操作,导致此时(*tmp)可能为NULL了。 * 执行: * tmp=&(*tmp)->next * 时候不会出现问题,执行具体的 * *tmp != NULL * 操作时候会报段错误 * * 所以代码应该添加*tmp!=NULL判断 */ *tmp = (*tmp)->next; #if 1 //added begin if (*tmp == NULL) break; #endif //added } } printf("\n"); for (tmp = &h; *tmp; tmp = &(*tmp)->next) { printf("%d ", (*tmp)->a); } printf("\n"); return 0; }
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

更多精彩