多重指针操作

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

 

一、简单的代码如下

 

#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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天糊土

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值