二级指针作为参数分析
来源:互联网 发布:局域网语音通话软件 编辑:程序博客网 时间:2024/05/18 02:07
二级指针参数如果是传出的,可以有两种情况:
第一种情况,传出的指针指向静态内存(见例1),或者指向已分配的动态内存(比如指向某个链表的节点);
第二种情况是在函数中动态分配内存,然后传出的指针指向这块内存空间,这种情况下调用者应该在使用内存之后调用释放内存的函数,调用者的责任是请求分配和请求释放内存,实现者的责任是完成分配内存和释放内存的操作。
二级指针可以表示传入参数,传出参数或者Value-result参数。
例1. 用二级指针做传出参数的系统函数:
static const char *msg[] = {"Sunday", "Monday", "Tuesday", "Wedsday", "Thursday", "Friday", "Saturday"};void get_a_day(const char **pp){ static int i = 0; *pp = msg[i%7]; i++;}
例2. 用二级指针分配内存,通过传出参数取得指向该内存的指针。一般来说,实现一个分配内存的函数就要实现一个释放内存的函数。
通过参数分配内存示例:void alloc_unit(unit_t **pp);
void free_unit(unit_t *p);
para_allocator.h
#ifndef PARA_ALLOCATOR_H#define PARA_ALLOCATOR_Htypedef struct{ int number; char *msg;} unit_t;extern void alloc_unit(unit_t **);extern void free_unit(unit_t *);#endif
para_allocator.c
#include <stdio.h>#include <string.h>#include <stdlib.h>#include "para_allocator.h"void alloc_unit(unit_t **pp){ unit_t *p = malloc(sizeof(unit_t)); if(p == NULL) { printf("out of memory\n"); exit(1); } p->number = 3; p->msg = malloc(20); strcpy(p->msg, "Hello World!"); *pp = p;}void free_unit(unit_t *p){ free(p->msg); free(p);}
main.c
#include <stdio.h>#include "para_allocator.h"int main(void){ unit_t *p = NULL; alloc_unit(&p); printf("number: %d\nmsg: %s\n", p->number, p->msg); free_unit(p); p = NULL; return 0;}
注:
两个新的预处理指示#ifndef PARA_ALLOCATOR_H和#endif,如果PARA_ALLOCATOR_H这个宏没有定义过,那么从#ifndef到#endif之间的代码就包含在预处理的输出结果中,否则这一段代码就不出现在预处理的输出结果中。para_allocator.h这个头文件的内容整个被#ifndef和#endif括起来了,如果在包含这个头文件时PARA_ALLOCATOR_H这个宏已经定义过了,则相当于这个头文件里什么都没有,包含了一个空文件。假如main.c包含了两次para_allocator.h:
则第一次包含para_allocator.h时并没有定义PARA_ALLOCATOR_H这个宏,因此头文件的内容包含在预处理的输出结果中;第二次再包含para_allocator.h就相当于包含了一个空文件,这就避免了头文件的内容被重复包含。这种保护头文件的写法称为Header Guard,每写一个头文件都要加上Header Guard,宏定义名就用头文件名的大写形式,这是规范的做法。
- 二级指针作为参数分析
- 二级指针作为函数参数申请内存
- 二级指针作为函数参数传递初始化的一点总结
- 二级指针作为函数参数传递初始化的一点总结
- 指针做参数 二级指针的详细分析
- C语言一级指针、二级指针、数组作为参数传递需要注意的若干问题
- 二维数组和二级指针作为参数传给参数的方式
- 指针作为函数参数
- 指针作为参数传递
- 指针作为参数
- 指针作为函数参数
- 指针作为参数传递
- 指针函数作为参数
- 指针作为函数参数
- 指针作为函数参数
- 指针作为参数传递
- 指针作为参数
- 函数指针作为参数
- 【DFS(记忆化)】hdu 2452 Navy maneuvers
- myeclipse中Tomcat常见的问题
- 单片机AT89C51键盘扫描识别实验
- Java编码过滤器
- Android开发基础——真机测试错误,ADB启动不了,程序安装不了,the connection to adb is down,INSTALL_CANCELED_BY_USER...
- 二级指针作为参数分析
- Mat转换成IplImage类型
- UltraISO 9.6.1.3016(带注册机)
- Maven常用记录
- IOS -运行时 (消息传递再探究)
- 失业七个月,面试六十家公司的深圳体验
- ZOJ 3785 What day is that day?(取模运算)
- 浅析观察者模式
- 在windows系统下一个机器中同时启动两个tomcat引发的问题总结