【C】二级指针参数

文章介绍了二级指针在C语言中的作用,包括作为传出参数时指向静态内存和动态内存的情况。在动态分配内存的例子中,强调了调用者需负责释放内存的重要性,并给出了解释为何需要二级指针进行内存操作的原因。同时,文章提供了一个规则,即传N级指针可修改N-1级指针的内容,因为C语言的参数传递是按值传递的。

指针就是指向内存地址的变量,二级指针也是指针,即指向指针的指针,同样可以表示传入参数、传出参数或者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语言的传参是按值传递的,直接修改形参是无法改变实参的,但可以通过传入的指针参数修改其指向的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值