指针就是指向内存地址的变量,二级指针也是指针,即指向指针的指针,同样可以表示传入参数、传出参数或者Value-result参数,只不过该参数所指的内存空间应该解释成一个指针变量。
二级指针参数如果是传出的,可以有两种情况:
- 传出的指针指向静态内存,或者指向已分配的动态内存(比如指向某个链表的节点)。
- 在函数中动态分配内存,然后传出的指针指向这块内存空间,这种情况下调用者应该在使用内存之后调用释放内存的函数,调用者的责任是请求分配和请求释放内存,实现者的责任是完成分配内存和释放内存的操作。
由于这两种情况的函数接口相同,应该在文档中说明是哪一种情况。
第一种情况实例
static const char *msg[] = {"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"};
void get_a_day(const char **pp)
{
static int i = 0;
*pp = msg[i % 7];
i++;
}
第二种情况
#ifndef _FOO_H_
#define _FOO_H_
typedef struct {
int number;
char *msg;
} unit_t;
void alloc_unit(unit_t **u);
void free_unit(unit_t *u);
#endif
#include "foo.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);
}
这里需要注意一点,free unit_t之前我们要先free msg。思考:为什么分配内存需要传入二级指针?一级指针不行吗?
这里有一个法则,传入一个N级指针,就可以修改N-1级的指针,原因是C语言的传参是按值传递的,直接修改形参是无法改变实参的,但可以通过传入的指针参数修改其指向的内容。
文章介绍了二级指针在C语言中的作用,包括作为传出参数时指向静态内存和动态内存的情况。在动态分配内存的例子中,强调了调用者需负责释放内存的重要性,并给出了解释为何需要二级指针进行内存操作的原因。同时,文章提供了一个规则,即传N级指针可修改N-1级指针的内容,因为C语言的参数传递是按值传递的。

被折叠的 条评论
为什么被折叠?



