之前对多重指针操作心存忐忑,不能很熟练使用,本质原因是不了解其实质,因此对其进行了学习。
一、简单的代码如下
#include <stdio.h>
#include <stdlib.h>
#include <string.h>void myArray(char ***p2, int num)
{int i=0;//不要判断*p2所指向的内存,//因为传参是&p1,也就是指针变量p1的地址;//如果再判断*p2,也就是判断指针变量p1的指向了,本来p1就指向NULL,判断没有什么意义。//毕竟这里判断的目的是,判断p2现在有没有存放地址了而已char **tmp = NULL;if(p2 == NULL) return;/*int* p;p = (int*)malloc( sizeof(int)*100 );//sizeof()中的类型只是表明多大而已,和p的类型没有必然的联系//一般来说,强制转换为什么类型,则sizeof()中的类型就少一颗*;*///tmp = (char **)malloc(sizeof(tmp) *100);//sizeof(tmp)=4,毕竟tmp是一个指针。tmp = (char **)malloc(sizeof(char*) * 100);//这里的100是说有100个字符串指针if(tmp == NULL)return;for (i =0; i<num; i++){//tmp[i] = (char *)malloc(sizeof(char *)* num );//sprintf(tmp[i], "%d""%d""%d", i+1, i+1, i+1);tmp[i] = (char *)malloc(sizeof(char )* num);sprintf(tmp[i], "%d""%d""%d", i + 1, i + 1, i + 1);//填充tmp[i]}*p2 = tmp;
}void myArray_Free(char ***p2, int num)
{int i = 0;char **tmp = NULL;if(p2 == NULL)return;tmp = *p2;for (i=0; i<num; i++)free(tmp[i]); //释放*tmp所指向的内存free(tmp);//释放tmp所指向的内存*p2 = NULL;//实参指向NULL
}int main()
{int i = 0;int num = 5;char ** p1 = NULL;//char tmp[100];myArray(&p1, num);for(i=0; i<num; i++){printf("p1 = %s\n", p1[i]);}myArray_Free(&p1, num);getchar();return 0;
}
对代码的解释如下
另外,这和二重指针与一重指针类似,之所以子函数中要三重指针作为参数,是因为要改变主函数中二重指针的指向。(这里主函数中是char** p=NULL,而子函数中要将p指向新开辟的有100个元素的空间)如果子函数中还是二重指针,而主函数中传参也是二重指针的话,就类似于值传递了,不能修改主函数二重指针的指向。按此道理,三重和四重应该是类似的道理的,只是很少用到。
二、leetcode的题目举例
https://blog.csdn.net/oqqHuTu12345678/article/details/72896249