多重指针操作

来源:互联网 发布:mac切换输入法设置 编辑:程序博客网 时间:2024/06/03 17:02

之前对多重指针操作心存忐忑,不能很熟练使用,本质原因是不了解其实质,因此对其进行了学习。


一、简单的代码如下

#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的题目举例



原创粉丝点击