之前对多重指针操作心存忐忑,不能很熟练使用,本质原因是不了解其实质,因此对其进行了学习。
一、简单的代码如下
#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