【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;
}
- 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)