C提高_day03_玩转多级指针

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

char **getMem51(int num)
{
    int i = 0;
    char **p2 = NULL;
    p2 = (char **)malloc(sizeof(char *) * num);
    if (p2 == NULL)
    {
        return NULL;
    }

    for (i=0; i<num; i++)
    {
        p2[i] = (char *)malloc(sizeof(char)  * 100  ); //char buf[100];
        sprintf(p2[i], "%d%d%d", i+1, i+1, i+1);
    }
    return p2;
}

int getMem52(char ***p3 , int num)
{
    int i = 0;
    char **tmp = NULL;

    if (p3 == NULL)  //判断p3 而不是*p3.  p3指向的内存空间可以是NULL
    {
        return -1;
    }

    tmp = (char **)malloc(sizeof(char *) * num);
    if (tmp == NULL)
    {
        return NULL;
    }

    for (i=0; i<num; i++)
    {
        tmp[i] = (char *)malloc(sizeof(char)  * 100  ); //char buf[100];
        sprintf(tmp[i], "%d%d%d", i+1, i+1, i+1);
    }
    *p3 = tmp;
    //1 2

    return 0;
}

void getMem52_Free(char ***p3 , int num)
{
    int i = 0;
    char **tmp = NULL;

    if (p3 == NULL)
    {
        return ;
    }
    tmp = *p3; 

    for (i=0; i<num; i++)
    {
        free(tmp[i]);
    }
    free(tmp);

    *p3 = NULL; //把实参赋值成null
}

void main()
{
    int i = 0, j = 0;
    char **p2 = NULL;
    int num = 5;

    //p2 = getMem51(num);

    getMem52(&p2, num);

    for (i=0; i<num; i++)
    {
        printf("%s \n", p2[i]);
    }

    getMem52_Free(&p2, num);
    printf("hello...\n");
    system("pause");
    return ;
}
时间: 2024-10-12 23:22:53

C提高_day03_玩转多级指针的相关文章

C提高_day03_两个辅助指针变量挖字符串(强化4)

#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <string.h> #include <stdio.h> //两个辅助指针变量挖字符串, 的第三种内存模型 //指针做函数参数 void FreeMem(char **myp,int count) //释放内存函数 { int i=0; if(myp == NULL) { return; } for(i=0;i<count;i++) { if

C提高_day03_两个辅助指针变量挖字符串(强化3)

#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <string.h> #include <stdio.h> //两个辅助指针变量挖字符串, 的第三种内存模型 //指针做函数参数 int spitString4(char *buf1,char c,char ***myp3,int *count) //**pp二级指针做输入 { char *p=NULL, *pTmp = NULL; int tmpc

C提高_day03_两个辅助指针变量挖字符串(强化2)

#include <stdlib.h> #include <string.h> #include <stdio.h> //两个辅助指针变量挖字符串, 的第三种内存模型 char ** spitString3(char *buf1,char c,int *count) //**pp二级指针做输入 { char *p=NULL, *pTmp = NULL; int tmpcount = 0; char **myp=NULL; //1 p和ptmp初始化 p = buf1;

C语言 详解多级指针与指针类型的关系

//通常意义上,指针类型指的是‘指针值’的类型,而不是‘指针’的类型 //V推论①:变量的步长只与变量的类型有关 //普通变量名是一段内存空间的标识,普通变量名代表的是一段内存空间, //对于复杂变量(例如指针):通常的指针的步长准确来说是指‘指针值’的步长,而不是指‘指针本身’的步长,指针本身的步长永远是4, //我们通常说的指针类型往往指的是‘指针值’的类型,,而不是‘指针’的类型 //而指针类型就是一个占4个字节大小内存空间的一种类型(从来没有人定义过指针类型,人们定义的都是‘指针值’的类

C 多级指针

C多级指针 *p                      -----> &p1 *(*p)                   ----->*(&p1) = &p2 *(*(*p))                 ----->*(&p2) = &p3 *(*(*(*p)))               ----->*(&p3)=&p4 *(*(*(*(*p))))            ----->*(&p4

图解多级指针与“多维”数组

指针与数组是C/C++编程中非常重要的元素,同时也是较难以理解的.其中,多级指针与“多维”数组更是让很多人云里雾里,其实,只要掌握一定的方法,理解多级指针和“多维”数组完全可以像理解一级指针和一维数组那样简单. 首先,先声明一些常识,如果你对这些常识还不理解,那么你先去弥补一下基础知识: 1.实际上并不存在多维数组,所谓的多维数组本质上是用一维数组模拟的. 2.数组名是一个常量(意味着不允许对其进行赋值操作),其代表数组首元素的首地址. 3.数组与指针的关系是因为数组下标操作符[],比如,int

c/c++多级指针

c/c++多级指针 如图: # include <stdio.h> int main(void) { int i = 10; int * p = &i; //p只能存放int类型变量的地址 int ** q = &p; //q是int **类型, 所谓int **类型就是指q只能存放int *类型变量的地址, int *** r = &q; //r是int ***类型, 所谓int ***类型就是指r只能存放int ** 类型变量的地址, //r = &p; /

C语言优化实例:消除多级指针的间接访问

如果一个多层次的数据结构达到两级或者两级以上,举例如下: struct A{ int array_member[100]; //其他数据成员 }; struct B{ struct A *a_ptr; //其他数据成员 } 那么通过B类型的指针b_ptr访问A类型的array_member的某一个元素array_member[0]则需要使用b_ptr->a_ptr->array_member[0]这种多级指针的形式.如果一个函数中多次用到这个变量的话,可以采用一个临时变量保存这个多级指针:in

多级指针的用途

多级指针你可以看成是一个树,每个节点都可以是一个小树,想找到每层节点的时候只能通过指针偏移确定,除非你知道他们具体的各级坐标,否则无法直接定位. 举个例子strA*******  tree;这个tree其实就是个地址值,不仅如此,这个大树后面只有*******  tree 这层节点保存的值是strA结构体,其他的保存的值全是指针.就是这么多层的指针实现了这个大树,实际使用的使用的时候,要保存每一层的长度,否则无法确定他有多长呵呵. 如果你需要一个类似table的东西或者类似map的东西,或者需要