1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 【C 语言】二级指针作为输出 ( 指针输入 | 指针输出 | 二级指针 作为 函数形参 使用示例 )

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

时间:2023-05-26 05:30:43

相关推荐

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

执行结果 :

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。