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

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

文章目录

一、二级指针

二、完整代码示例





一、二级指针


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


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



如果要在 函数中 分配内存 , 则 需要 传入二级指针 , 在函数内部调用 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;
}



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


/*
 * 释放字符串内存
 */
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;
}





二、完整代码示例


完整代码示例 :


#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;
}


执行结果 :


image.png

目录
相关文章
|
15天前
|
程序员 C语言
C语言库函数 — 内存函数(含模拟实现内存函数)
C语言库函数 — 内存函数(含模拟实现内存函数)
24 0
|
1天前
|
存储 C语言
C语言函数的返回值
C语言函数的返回值
7 0
|
2天前
|
C语言 Windows
C语言中的fopen与fclose函数详解
C语言中的fopen与fclose函数详解
10 1
|
2天前
|
存储 C语言
指针数组作为main函数的形参
指针数组作为main函数的形参
11 0
|
2天前
|
C语言
深入理解C语言中的printf函数及数据输出
深入理解C语言中的printf函数及数据输出
11 0
|
15天前
|
程序员 C语言 开发者
C语言库函数 — 字符串函数(含模拟实现字符串函数)
C语言库函数 — 字符串函数(含模拟实现字符串函数)
35 0
|
15天前
|
存储 C语言
C语言 — 指针进阶篇(下)
C语言 — 指针进阶篇(下)
20 0
|
15天前
|
存储 C语言 C++
C语言 — 指针进阶篇(上)
C语言 — 指针进阶篇(上)
26 0
|
21天前
|
存储 程序员 C语言
C语言指针的概念、语法和实现
在C语言中,指针是其最重要的概念之一。 本文将介绍C语言指针的概念、语法和实现,以及如何使用它们来编写高效的代码。
13 0
|
29天前
|
存储 人工智能 编译器
C语言指针详解
指针运算,指针和数组,二级指针
C语言指针详解