C语言 三级指针的应用

//三级指针的使用
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//三级指针做输出
int getmun(char ***pout/*out*/,int *num){
    int ERRO_MSG = 0;
    if (pout==NULL)
    {
        ERRO_MSG = 1;
        printf("危险操作内存pout==NULL erro msg:%d", ERRO_MSG);
        return ERRO_MSG;
    }
    if (num == NULL)
    {
        ERRO_MSG = 2;
        printf("危险操作内存num==NULL erro msg:%d", ERRO_MSG);
        return ERRO_MSG;
    }
    int numx = 5;
    char **ptemp = (char **)malloc(sizeof(char *)*numx);
    int i = 0;
    for (i = 0; i < numx; i++)
    {
        ptemp[i] = (char *)malloc(sizeof(char)*20);
        char buf[20] = { 0 };
        sprintf(buf, "第%d同志们大家好", i);
        strcpy(ptemp[i], buf);
    }
    *pout = ptemp;
    *num = numx;
    return ERRO_MSG;
}

//打印数组
int printfall(char **pin,int num){
    int ERRO_MSG= 0, i = 0;
    if (pin==NULL)
    {
        ERRO_MSG = 1;
        printf("pin==NULL erro msg:%d\n", ERRO_MSG);
        return ERRO_MSG;
    }
    for (i = 0; i < num; i++)
    {
        if (pin[i] != NULL)
        {
            printf("%s\n", pin[i]);
        }
        else{
            ERRO_MSG = 2;
            printf("数据录入错误! erro msg:%d\n", ERRO_MSG);
            return ERRO_MSG;
        }
    }
    return ERRO_MSG;
}

//释放堆内存(三级指针做输入)
int freeall(char ***pin,int num){
    int ERRO_MSG = 0, i = 0;
    if (pin==NULL)
    {
        ERRO_MSG = 1;
        printf("pin==NULL erro msg:%d\n", ERRO_MSG);
        return ERRO_MSG;
    }
    char **tempp = *pin;//灵性代码,用一个变量接收一下
    if (tempp == NULL)
    {
        ERRO_MSG = 1;
        printf("*pin==NULL 二维数组数据不可以为空 erro msg:%d\n", ERRO_MSG);
        return ERRO_MSG;
    }
    for (i = 0; i < num; i++)
    {
        if (tempp[i] != NULL)
        {
            free((*pin)[i]);
            tempp[i] = NULL;
        }
        else{
            ERRO_MSG = 2;
            printf("*pin==NULL 二维数组数据不可以为空 erro msg:%d\n", ERRO_MSG);
            return ERRO_MSG;
        }
    }
    free(tempp);
    tempp = NULL;
    *pin = NULL;
    return ERRO_MSG;
}

void main()
{
    char **p1 = NULL;
    int num = 0, i = 0;
    int rest= getmun(&p1, &num);
    //打印p1的内容
    if (rest==0)
    {
        //打印数组
        printfall(p1, num);
        //释放内存
        freeall(&p1,num);
        printf("%p\n", p1);
    }

    system("pause");
}

时间: 2024-10-29 21:13:27

C语言 三级指针的应用的相关文章

C语言07指针高级

01内存四区 接口封装和设计思想引导 接口封装设计思想引导 Sckclient客户端api模型设计 第一套api函数 #ifndef _SCK_CLINT_H_ #define _SCK_CLINT_H_ //函数声明 // 1.client环境初始化 int sckClient_init(void **handle); //5 day // // 2.client发送报文 int sckClient_send(void *handle, unsigned char *data, int dat

C语言二级指针的介绍和使用

锄禾日当午,学C真TM苦. 指针是C语言中功能最强大的部分,但是也是最难理解的部分. 本文主要介绍二级指针的使用,包括与数组和函数结合的使用,一级指针简单带过. 一.一级指针 一级指针的简单描述 ①一级指针是一种以存储其他变量地址为目的的变量.一个T类型的指针变量(一级指针)就是一个存储了某T类型值变量的内存地址的引用. ②对指针的解引用(也就是*),是获取指针指向的内存空间中存储的值. ③当指针解引用做左值的时候,可以改变指针指向内存空间中存储的值. ④指针指向哪个变量,就将该变量的内存地址赋

c语言基础----指针

什么是指针? 指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址. 指针变量声明 type *var-name; type 是指针的基类型,它必须是一个有效的 C 数据类型,var-name 是指针变量的名称.用来声明指针的星号 * 与乘法中使用的星号是相同的. 空指针 赋为 NULL 值的指针被称为空指针,NULL 指针是一个定义在标准库中的值为零的常量. 数组指针: 它是一个指针,它指向一个数组.指向数组的指针,本质是指针. int (*p)[3]   因为()优先级高,首先说明

C#委托与C语言函数指针及函数指针数组

C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用的时候通过指针访问这个函数. 在C语言中函数指针的申明如下: //可以理解为申明一个指着变量 Func ,它的类型是 返回Type(可以为 void )类型的参数,接收 (Type one,Type two,...)类型的//参数(可以不接受参数). Type *Func(Type one,Type

C语言的指针变量

C语言的指针变量 在C语言中,变量是固定范围的存储空间,它存储的是赋给他的值, 比如: int a = 12; /* 这里是定义一个整型变量a,并把12这个值存储在a的地址空间上 这个地址空间是系统随机分配的,对用户是透明的不用关心 */ 指针变量存储的是变量的地址, 比如: int a = 12 , *b; b = &a; /*如上,定义了一个整型变量a并赋值12,一个整型指针变量b 然后 用 & 取值运算符 取到变量a的地址空间值,存储到指针变量b中 此时变量b中存储的是变量a中的地址

三级指针的应用场景

1.问题:将指针数组和二维数组中的字符串存放到第三个指针所指向的内存空间中,并进行排序(默认升序)输出,必须通过函数来完成. (1).代码如下: #include<stdio.h> #include<string.h> #include<malloc.h> void destorySpace_2(char ***p3, int len3); void destorySpace_1(char **p3, int len3); int sort(char **myp1, i

三级指针四级存储空间的开辟~

三级指针四级存储空间 2015-05-15  青岛  张俊浩 今天在技术问答板块看到的帖子,花时间调出来,也顺便整理作为笔记~ 原帖是: #include<stdio.h> #include<stdlib.h> #include<string.h> char*** Create3DActiveArray(int x, int y, int z) { char ***pArr; int i, j,k; pArr = (char ***)malloc(x * sizeof(

黑 马 程 序 员_视频学习总结&lt;c语言&gt;----03 指针

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.什么是指针? 用来存放变量地址的变量,就称为"指针变量". 二.指针的定义 一般形式:类名标识符  *指针变量名; int *p; float *q; "*"是一个说明符,用来说明这个变量是个指针变量,是不能省略的,但它不属于变量名的一部分 前面的类型标识符表示指针变量所指向的变量的类型,而且只能指向这种类型的

C语言的指针移位问题

先贴代码 #include <stdio.h> int main(void) { double a[]={1.1,2.2,3.3}; unsigned int b,c,d; b=&a[0]+1;c=&a[1];d=&a[2]; printf("diff -- %d", c-b); return 0; } 执行结果是 diff -- 0 这是32位的代码,所以可以用unsigned int类型来储存地址位. 由于a[0]是double类型,所以&