【C 语言】二级指针作为输出 ( 指针输入 | 指针输出 | 二级指针 作为 函数形参 使用示例 )

举报
韩曙亮 发表于 2022/01/12 22:46:45 2022/01/12
【摘要】 文章目录 一、二级指针二、完整代码示例 一、二级指针 指针 作为 函数输入 : 调用者 负责 分配内存 ; 指针 作为 函数输出 : 函数 负责 分配内存 , 一...





一、二级指针



指针 作为 函数输入 : 调用者 负责 分配内存 ;

指针 作为 函数输出 : 函数 负责 分配内存 , 一般 传入二级指针 , 函数负责生成内存 , 并 使用 二级指针 指向 一级指针, 一级指针 指向 在 函数中 分配好内存 ;


如果要在 函数中 分配内存 , 则 需要 传入二级指针 , 在函数内部调用 malloc 函数 , 分配内存 , 返回一个 一级指针 变量 ;

令 二级指针 形参 指向 该 一级指针变量 , 即可通过间接赋值 返回相关结果 ;

代码示例如下 :

/*
 * 生成 2 个字符串, 然后返回
 */
int get_str(char **str1, int *len1, char **str2, int *len2)
{
    char *s1 = NULL;
    char *s2 = NULL;

    // I . 生成第一个字符串
    s1 = (char *)malloc(64);
    // 判断内存分配是否成功
    if(s1 == NULL)
    {
        return -1;
    }

    // 向内存空间写入值
    strcpy(s1, "abcd");
    // 计算字符串大小
    *len1 = strlen(s1);

    // 将生成的字符串 , 通过二级指针 间接赋值 给 一级指针
    *str1 = s1;


    // II . 生成第一个字符串
    s2 = (char *)malloc(64);
    // 判断内存分配是否成功
    if(s2 == NULL)
    {
        return -2;
    }

    // 向内存空间写入值
    strcpy(s2, "1234");
    // 计算字符串大小
    *len2 = strlen(s2);

    // 将生成的字符串 , 通过二级指针 间接赋值 给 一级指针
    *str2 = s2;


    return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

二级指针 最终 指向的内存释放 : 释放二级指针 指向的 一级指针 指向的内存的地址 , 释放后 将指针指向的地址置空 ;

/*
 * 释放字符串内存
 */
int free_str(char **str)
{
    // 判断传入的二级指针是否合法
    if(str == NULL)
    {
        return -1;
    }

    // 释放二级指针 指向的 一级指针 指向的内存的地址

    // 释放指针
    free(*str);
    // 将指针指向的地址置空
    *str = NULL;

    return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

一级指针 指向的内存释放 : 释放一级指针 指向的内存的地址 , 释放后 无法 将指针指向的地址置空 ;

/*
 * 释放字符串内存
 * 传入 一级指针 , 只能释放一级指针指向的内存
 * 不能 讲一级指针 置空
 */
int free_str2(char *str)
{
    // 判断传入的二级指针是否合法
    if(str == NULL)
    {
        return -1;
    }

    // 释放一级指针
    free(str);

    return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18




二、完整代码示例



完整代码示例 :

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

/*
 * 生成 2 个字符串, 然后返回
 */
int get_str(char **str1, int *len1, char **str2, int *len2)
{
    char *s1 = NULL;
    char *s2 = NULL;

    // I . 生成第一个字符串
    s1 = (char *)malloc(64);
    // 判断内存分配是否成功
    if(s1 == NULL)
    {
        return -1;
    }

    // 向内存空间写入值
    strcpy(s1, "abcd");
    // 计算字符串大小
    *len1 = strlen(s1);

    // 将生成的字符串 , 通过二级指针 间接赋值 给 一级指针
    *str1 = s1;


    // II . 生成第一个字符串
    s2 = (char *)malloc(64);
    // 判断内存分配是否成功
    if(s2 == NULL)
    {
        return -2;
    }

    // 向内存空间写入值
    strcpy(s2, "1234");
    // 计算字符串大小
    *len2 = strlen(s2);

    // 将生成的字符串 , 通过二级指针 间接赋值 给 一级指针
    *str2 = s2;


    return 0;
}

/*
 * 释放字符串内存
 */
int free_str(char **str)
{
    // 判断传入的二级指针是否合法
    if(str == NULL)
    {
        return -1;
    }

    // 释放二级指针 指向的 一级指针 指向的内存的地址

    // 释放指针
    free(*str);
    // 将指针指向的地址置空
    *str = NULL;

    return 0;
}

/*
 * 释放字符串内存
 * 传入 一级指针 , 只能释放一级指针指向的内存
 * 不能 讲一级指针 置空
 */
int free_str2(char *str)
{
    // 判断传入的二级指针是否合法
    if(str == NULL)
    {
        return -1;
    }

    // 释放一级指针
    free(str);

    return 0;
}

int main()
{
    // 第一个字符串
    char *str1 = NULL;
    // 第一个字符串字符个数
    int len1 = 0;

    // 第二个字符串
    char *str2 = NULL;
    // 第二个字符串字符个数
    int len2 = 0;

    // 函数调用的返回值
    int ret = 0;

    // 调用函数 , 传入二级指针
    ret = get_str(&str1, &len1, &str2, &len2);

    // 打印函数中生成的字符串
    printf("str1 = %s, str2 = %s\n", str1, str2);

    // 释放字符串指针指向的内存 , 传入二级指针
    free_str(&str1);
    // 释放字符串指针指向的内存 , 传入一级指针
    free_str2(str2);

    // 命令行不要退出
    system("pause");
    return 0;
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120

执行结果 :

在这里插入图片描述

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/121549606

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。