跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C 语言多级指针
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{Note|本教程假设读者已掌握C语言基础指针概念(如一级指针、取地址运算符`&`和解引用运算符`*`)}} = C语言多级指针 = '''多级指针'''(Multi-level Pointers)是指向指针的指针,在C语言中常用于动态内存管理、多维数组处理及函数参数传递等场景。通过多级指针可以实现更灵活的数据结构操作。 == 基本概念 == 多级指针的本质是'''链式存储的地址'''。当指针变量存储另一个指针的地址时,形成多级指针关系: <mermaid> graph LR A[二级指针] --> B[一级指针] --> C[实际变量] </mermaid> 数学表达为: <math> \text{二级指针} \rightarrow \text{一级指针} \rightarrow \text{变量} </math> === 声明语法 === {{Infobox|声明格式|2= * 二级指针:<code>数据类型** 变量名;</code> * 三级指针:<code>数据类型*** 变量名;</code> * (以此类推) }} == 代码示例 == === 二级指针基础 === <syntaxhighlight lang="c"> #include <stdio.h> int main() { int num = 42; int *ptr1 = # // 一级指针 int **ptr2 = &ptr1; // 二级指针 printf("num的值: %d\n", num); printf("通过ptr1访问: %d\n", *ptr1); printf("通过ptr2访问: %d\n", **ptr2); return 0; } </syntaxhighlight> {{Output| num的值: 42 通过ptr1访问: 42 通过ptr2访问: 42 }} === 三级指针示例 === <syntaxhighlight lang="c"> #include <stdio.h> int main() { float val = 3.14; float *p1 = &val; float **p2 = &p1; float ***p3 = &p2; printf("原始值: %.2f\n", val); printf("三级指针解引用: %.2f\n", ***p3); // 修改值 ***p3 = 6.28; printf("修改后的值: %.2f\n", val); return 0; } </syntaxhighlight> {{Output| 原始值: 3.14 三级指针解引用: 3.14 修改后的值: 6.28 }} == 内存模型分析 == 以下示例展示三级指针的内存关系: <mermaid> graph TD A[val: 3.14] B[p1] --> A C[p2] --> B D[p3] --> C </mermaid> 对应的内存地址关系: <syntaxhighlight lang="c"> printf("val地址: %p\n", &val); printf("p1存储的地址: %p\n", p1); printf("p2存储的地址: %p\n", p2); printf("p3存储的地址: %p\n", p3); </syntaxhighlight> == 实际应用场景 == === 动态二维数组 === <syntaxhighlight lang="c"> #include <stdlib.h> int main() { int rows = 3, cols = 4; int **matrix = (int**)malloc(rows * sizeof(int*)); for(int i = 0; i < rows; i++) { matrix[i] = (int*)malloc(cols * sizeof(int)); } // 使用matrix[row][col]访问元素 matrix[1][2] = 5; // 第二行第三列赋值为5 // 释放内存 for(int i = 0; i < rows; i++) { free(matrix[i]); } free(matrix); return 0; } </syntaxhighlight> === 函数参数传递 === 当需要修改指针变量本身时: <syntaxhighlight lang="c"> void allocateMemory(int **ptr) { *ptr = (int*)malloc(sizeof(int)); **ptr = 100; } int main() { int *p = NULL; allocateMemory(&p); // 传递指针的地址 printf("分配的值: %d\n", *p); free(p); return 0; } </syntaxhighlight> {{Output| 分配的值: 100 }} == 常见错误 == {{Warning| 1. '''解引用层级错误''': <syntaxhighlight lang="c"> int x = 10; int **pp = &x; // 错误!x不是指针类型 </syntaxhighlight> 2. '''未初始化的多级指针''': <syntaxhighlight lang="c"> int ***ppp; // 未初始化 printf("%d", ***ppp); // 段错误 </syntaxhighlight> }} == 进阶理解 == 多级指针的层级关系可以通过连续解引用验证: <math> \begin{align} \text{三级指针} & : \text{***ppp} \\ \text{二级指针} & : \text{**pp} \\ \text{一级指针} & : \text{*p} \end{align} </math> == 总结 == {| class="wikitable" |+ 多级指针特性总结 ! 指针层级 !! 声明示例 !! 解引用方式 !! 典型应用 |- | 一级指针 | <code>int* p</code> | <code>*p</code> | 单变量操作 |- | 二级指针 | <code>int** pp</code> | <code>**pp</code> | 动态数组/修改指针 |- | 三级指针 | <code>int*** ppp</code> | <code>***ppp</code> | 复杂数据结构 |} {{KeyPoint|多级指针的核心原则:每一级指针存储的是上一级指针的地址,最终通过链式解引用访问目标数据}} [[Category:编程语言]] [[Category:C]] [[Category:C 语言指针]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Infobox
(
编辑
)
模板:KeyPoint
(
编辑
)
模板:Mbox
(
编辑
)
模板:Note
(
编辑
)
模板:Output
(
编辑
)
模板:Template other
(
编辑
)
模板:Warning
(
编辑
)
模块:Arguments
(
编辑
)
模块:Infobox
(
编辑
)
模块:Infobox/styles.css
(
编辑
)
模块:Message box
(
编辑
)
模块:Message box/ambox.css
(
编辑
)
模块:Message box/configuration
(
编辑
)
模块:Yesno
(
编辑
)