在前面的文章《如何理解C指针及二级指针(1)》 介绍了指针的一些重要概念,对于一级指针,相对来讲是比较容易理解的,这里就不再赘述了。我们重点来看一下二级指针的使用方式。
我们知道,不管是几级 指针,本质上也是个普通变量,只不过指向的内容不同而已。二级指针指向的是“一级指针的地址”。
这里,参考博友二级指针的详解的里的图片,向作者致谢。
使用方法一:
先为二级指针分配空间,然后赋值,解引用采用*。
代码段:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int **ptr = NULL;
int num = 4, size = 4;
int i,j;
ptr = (int **)malloc(num * sizeof(int *));
for(i = 0; i < num; i++){
*(ptr + i) = (int *)malloc(size * sizeof(int));
for(j = 0; j < size; j++)
*(*(ptr + i) + j) = (i + 1)*j;
}
for(i = 0; i < num; i++){
for(j = 0; j < size; j++){
printf("(%d, %d) -> %d\t", i, j, *(*(ptr +i) + j));
}
printf("\n");
}
return 0;
}
程序执行结果:
进一步,通过指针指向图来说明,如下图所示:
使用方法二:
先为二级指针分配空间,然后赋值,解引用采用数组方式。
程序代码:
ptr = (int **)malloc(num * sizeof(int *));
for(i = 0; i < num; i++){
ptr[i] = (int *)malloc(size * sizeof(int));
for(j = 0; j < size; j++)
ptr[i][j] = (i + 1)*j;
}
for(i = 0; i < num; i++){
for(j = 0; j < size; j++){
printf("[%d, %d] -> %d\t", i, j, ptr[i][j]);
}
printf("\n");
}
运行结果:
在内存中,指针指向图:
小结:
我们在使用二级指针时,牢记,二级指针也只是一个普通变量,只不过这个二级指针变量要指向的是一个 指针的地址,理解的时候,一定要先入为主这个概念,这是最根本的定义。
我们在对指针进行间接引用时,可以使用“*”操作符,也可以使用数组“[ ]”,这说明“*”和“[ ]”的效果是相同的,根据自己的习惯使用就好,我更喜欢使用“[ ]”。