II.C语言本质_24函数接口_3两层指针的参数

上传人:飞*** 文档编号:47490069 上传时间:2018-07-02 格式:PDF 页数:5 大小:51.14KB
返回 下载 相关 举报
II.C语言本质_24函数接口_3两层指针的参数_第1页
第1页 / 共5页
II.C语言本质_24函数接口_3两层指针的参数_第2页
第2页 / 共5页
II.C语言本质_24函数接口_3两层指针的参数_第3页
第3页 / 共5页
II.C语言本质_24函数接口_3两层指针的参数_第4页
第4页 / 共5页
II.C语言本质_24函数接口_3两层指针的参数_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《II.C语言本质_24函数接口_3两层指针的参数》由会员分享,可在线阅读,更多相关《II.C语言本质_24函数接口_3两层指针的参数(5页珍藏版)》请在金锄头文库上搜索。

1、第 24 章 函数接口3. 两层指针的参数两层指针也是指针,同样可以表示传入参数、传出参数或者Value-result 参数, 只不过该参数所指的内存空间应该解释成一个指针变量。用两层指针做传出参数 的系统函数也很常见,比如pthread_join(3)的 void *参数。下面看一个简单 的例子。例 24.3. 两层指针做传出参数/* redirect_ptr.h */ #ifndef REDIRECT_PTR_H #define REDIRECT_PTR_H extern void get_a_day(const char *); #endif 想一想,这里的参数指针是const char

2、 *,有 const 限定符,却不是传入参数 而是传出参数,为什么?如果是传入参数应该怎么表示?/* redirect_ptr.c */ #include “redirect_ptr.h“ static const char *msg = “Sunday“, “Monday“, “Tuesday“, “Wednesday“, “Thursday“, “Friday“, “Saturday“; void get_a_day(const char *pp) static int i = 0; *pp = msgi%7; i+; /* main.c */ #include #include “red

3、irect_ptr.h“ int main(void) const char *firstday = NULL; const char *secondday = NULL; get_a_day( get_a_day( printf(“%st%sn“, firstday, secondday); return 0; 两层指针作为传出参数还有一种特别的用法,可以在函数中分配内存, 调用者通 过传出参数取得指向该内存的指针, 比如 getaddrinfo(3)的 struct addrinfo * 参数。一般来说, 实现一个分配内存的函数就要实现一个释放内存的函数,所以 getaddrinfo(3)

4、有一个对应的 freeaddrinfo(3)函数。表 24.4. 通过参数分配内存示例:void alloc_unit(unit_t *pp);void free_unit(unit_t *p);调用者实现者1. 分配 pp 所指的指针变量的空 间 2. 调用 alloc_unit分配内存 3. 读取 pp 所指的指针变量,通 过后者使用 alloc_unit分配 的内存 4. 调用 free_unit释放内存1. 规定指针参数的类型unit_t * 2. alloc_unit分配 unit_t的内存并初 始化,为 pp 所指的指针变量赋值 3. free_unit释放在 alloc_unit

5、中分 配的内存例 24.4. 通过两层指针参数分配内存/* para_allocator.h */ #ifndef PARA_ALLOCATOR_H #define PARA_ALLOCATOR_H typedef struct int number; char *msg; unit_t; extern void alloc_unit(unit_t *); extern void free_unit(unit_t *); #endif /* para_allocator.c */ #include #include #include #include “para_allocator.h“ vo

6、id alloc_unit(unit_t *pp) unit_t *p = malloc(sizeof(unit_t); if(p = NULL) printf(“out of memoryn“); 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 #include “para_allocator.h“ int main(void) unit

7、_t *p = NULL; alloc_unit( printf(“number: %dnmsg: %sn“, p-number, p-msg); free_unit(p); p = NULL; return 0; 思考一下,为什么在main 函数中不能直接调用free(p)释放内存,而要调用 free_unit(p)?为什么一层指针的函数接口void alloc_unit(unit_t *p);不能 分配内存,而一定要用两层指针的函数接口?总结一下,两层指针参数如果是传出的,可以有两种情况:第一种情况,传出的 指针指向静态内存(比如上面的例子),或者指向已分配的动态内存(比如指向 某个链表的节点) ;第二种情况是在函数中动态分配内存,然后传出的指针指向 这块内存空间, 这种情况下调用者应该在使用内存之后调用释放内存的函数,调 用者的责任是请求分配和请求释放内存,实现者的责任是完成分配内存和释放内 存的操作。由于这两种情况的函数接口相同,应该在文档中说明是哪一种情况。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号