多级指针是C语言中较为复杂的概念,但理解其本质后会发现其实很简单。东巴文(db-w.cn) 将带你深入理解多级指针的概念与应用。
💡 东巴文观点:多级指针本质上就是指针的指针,理解指针的本质是掌握多级指针的关键。
#include <stdio.h>
int main() {
printf("=== 东巴文指针的本质 ===\n\n");
int num = 10;
int *ptr = #
printf("num = %d\n", num);
printf("&num = %p\n", &num);
printf("ptr = %p\n", ptr);
printf("*ptr = %d\n", *ptr);
return 0;
}
东巴文说明:
& 取地址运算符* 解引用运算符#include <stdio.h>
int main() {
printf("=== 东巴文二级指针概念 ===\n\n");
int num = 10;
int *ptr = # // 一级指针
int **pptr = &ptr; // 二级指针
printf("num = %d\n", num);
printf("&num = %p\n\n", &num);
printf("ptr = %p\n", ptr);
printf("&ptr = %p\n", &ptr);
printf("*ptr = %d\n\n", *ptr);
printf("pptr = %p\n", pptr);
printf("*pptr = %p\n", *pptr);
printf("**pptr = %d\n", **pptr);
return 0;
}
东巴文说明:
int **pptr - pptr是指向int指针的指针*pptr 得到一级指针**pptr 得到最终的数据#include <stdio.h>
int main() {
printf("=== 东巴文二级指针内存布局 ===\n\n");
int num = 100;
int *ptr = #
int **pptr = &ptr;
printf("内存地址布局:\n");
printf("num的地址:%p\n", &num);
printf("num的值:%d\n\n", num);
printf("ptr的地址:%p\n", &ptr);
printf("ptr的值(指向num):%p\n", ptr);
printf("ptr指向的值:%d\n\n", *ptr);
printf("pptr的地址:%p\n", &pptr);
printf("pptr的值(指向ptr):%p\n", pptr);
printf("pptr指向的指针:%p\n", *pptr);
printf("pptr最终指向的值:%d\n", **pptr);
return 0;
}
#include <stdio.h>
void modifyValue(int **pptr, int newValue) {
**pptr = newValue;
}
int main() {
printf("=== 东巴文通过二级指针修改值 ===\n\n");
int num = 10;
int *ptr = #
printf("修改前:num = %d\n", num);
modifyValue(&ptr, 100);
printf("修改后:num = %d\n", num);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("=== 东巴文动态二维数组 ===\n\n");
int rows = 3;
int cols = 4;
// 分配指针数组
int **matrix = (int **)malloc(rows * sizeof(int *));
// 为每一行分配内存
for (int i = 0; i < rows; i++) {
matrix[i] = (int *)malloc(cols * sizeof(int));
}
// 初始化
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
matrix[i][j] = i * cols + j + 1;
}
}
// 输出
printf("动态二维数组:\n");
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
printf("%2d ", matrix[i][j]);
}
printf("\n");
}
// 释放内存
for (int i = 0; i < rows; i++) {
free(matrix[i]);
}
free(matrix);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
printf("=== 东巴文字符串数组 ===\n\n");
int count = 3;
// 分配指针数组
char **strings = (char **)malloc(count * sizeof(char *));
// 为每个字符串分配内存
strings[0] = (char *)malloc(20);
strings[1] = (char *)malloc(20);
strings[2] = (char *)malloc(20);
// 初始化
strcpy(strings[0], "Hello");
strcpy(strings[1], "东巴文");
strcpy(strings[2], "db-w.cn");
// 输出
printf("字符串数组:\n");
for (int i = 0; i < count; i++) {
printf("strings[%d] = %s\n", i, strings[i]);
}
// 释放内存
for (int i = 0; i < count; i++) {
free(strings[i]);
}
free(strings);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
void allocateMemory(int **ptr, int size) {
*ptr = (int *)malloc(size * sizeof(int));
}
int main() {
printf("=== 东巴文函数参数传递指针 ===\n\n");
int *arr = NULL;
int size = 5;
printf("分配前:arr = %p\n", arr);
allocateMemory(&arr, size);
printf("分配后:arr = %p\n", arr);
// 初始化
for (int i = 0; i < size; i++) {
arr[i] = i + 1;
}
// 输出
printf("数组内容:\n");
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
// 释放内存
free(arr);
return 0;
}
#include <stdio.h>
int main() {
printf("=== 东巴文三级指针概念 ===\n\n");
int num = 10;
int *ptr = # // 一级指针
int **pptr = &ptr; // 二级指针
int ***ppptr = &pptr; // 三级指针
printf("num = %d\n", num);
printf("*ptr = %d\n", *ptr);
printf("**pptr = %d\n", **pptr);
printf("***ppptr = %d\n", ***ppptr);
return 0;
}
东巴文说明:
#include <stdio.h>
#include <stdlib.h>
void allocate2DArray(int ***arr, int rows, int cols) {
*arr = (int **)malloc(rows * sizeof(int *));
for (int i = 0; i < rows; i++) {
(*arr)[i] = (int *)malloc(cols * sizeof(int));
}
}
int main() {
printf("=== 东巴文三级指针应用 ===\n\n");
int **matrix = NULL;
int rows = 3, cols = 4;
allocate2DArray(&matrix, rows, cols);
// 初始化
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
matrix[i][j] = i * cols + j + 1;
}
}
// 输出
printf("动态二维数组:\n");
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
printf("%2d ", matrix[i][j]);
}
printf("\n");
}
// 释放内存
for (int i = 0; i < rows; i++) {
free(matrix[i]);
}
free(matrix);
return 0;
}
#include <stdio.h>
int main() {
printf("=== 东巴文遍历字符串数组 ===\n\n");
char *strings[] = {"Hello", "World", "东巴文"};
char **ptr = strings;
int count = sizeof(strings) / sizeof(strings[0]);
printf("使用二级指针遍历:\n");
for (int i = 0; i < count; i++) {
printf("*(ptr + %d) = %s\n", i, *(ptr + i));
}
return 0;
}
#include <stdio.h>
int main() {
printf("=== 东巴文遍历二维数组 ===\n\n");
int matrix[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int *ptr[3] = {matrix[0], matrix[1], matrix[2]};
int **pptr = ptr;
printf("使用二级指针遍历:\n");
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", *(*(pptr + i) + j));
}
printf("\n");
}
return 0;
}
#include <stdio.h>
int main() {
printf("=== 东巴文避免过多层级 ===\n\n");
// ✅ 推荐:使用必要的层级
int num = 10;
int *ptr = #
int **pptr = &ptr;
printf("二级指针:%d\n", **pptr);
// ❌ 不推荐:使用过多层级
// int ***ppptr = &pptr;
// int ****pppptr = &ppptr;
printf("\n建议:实际应用中很少需要超过二级指针\n");
return 0;
}
#include <stdio.h>
int main() {
printf("=== 东巴文清晰的命名 ===\n\n");
int value = 100;
// ✅ 推荐:清晰的命名
int *ptrToValue = &value;
int **ptrToPtrToValue = &ptrToValue;
printf("value = %d\n", value);
printf("*ptrToValue = %d\n", *ptrToValue);
printf("**ptrToPtrToValue = %d\n", **ptrToPtrToValue);
return 0;
}
#include <stdio.h>
// 使用typedef简化多级指针
typedef int *IntPtr;
typedef IntPtr *IntPtrPtr;
int main() {
printf("=== 东巴文使用typedef简化 ===\n\n");
int num = 100;
IntPtr ptr = #
IntPtrPtr pptr = &ptr;
printf("num = %d\n", num);
printf("*ptr = %d\n", *ptr);
printf("**pptr = %d\n", **pptr);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("=== 东巴文内存管理 ===\n\n");
int rows = 3;
int cols = 4;
// 分配
int **matrix = (int **)malloc(rows * sizeof(int *));
for (int i = 0; i < rows; i++) {
matrix[i] = (int *)malloc(cols * sizeof(int));
}
// 使用...
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
matrix[i][j] = i * cols + j;
}
}
printf("动态二维数组已分配\n");
// ✅ 正确:按相反顺序释放
for (int i = 0; i < rows; i++) {
free(matrix[i]);
}
free(matrix);
printf("内存已正确释放\n");
return 0;
}
完成本章学习后,请确认:
掌握多级指针后,你可以继续学习:
如果遇到问题,欢迎访问 东巴文(db-w.cn) 获取帮助!
东巴文(db-w.cn) - 让编程学习更简单
🎯 东巴文多级指针提示:多级指针本质上就是指针的指针。在 db-w.cn,我们会通过大量实例帮你掌握多级指针!