-
传入参数与传出参数
strcpy
的src
参数是传入参数,dest
参数是传出参数。有些函数的指针参数同时担当了这两种角色,如select(2)
的fd_set *
参数,既是传入参数又是传出参数,这称为Value-result参数。1.传入参数示例:
void func(const unit_t *p);
2.传出参数示例:
void func(unit_t *p);
3.Value-result参数示例:
void func(unit_t *p);
- 两层指针的参数
#ifndef REDIRECT_PTR_H
#define REDIRECT_PTR_H
extern void get_a_day(const char **);
#endif
#include "redirect_ptr.h"
static const char *msg[] = {"Sunday", "Monday", "Tuesday", "Wednesday",
void get_a_day(const char **pp)
{
}
#include <stdio.h>
#include "redirect_ptr.h"
int main(void)
{
}
void alloc_unit(unit_t **pp);
void free_unit(unit_t *p);
- 返回值是指针
localtime(3)
和inet_ntoa(3)
,第二种是在函数中动态分配内存并传出指向这块内存的指针,例如malloc(3)
,这种情况通常还要实现一个释放内存的函数。其实质就相当于一个指针函数。
1.返回指向已分配内存的指针示例
:unit_t *func(void);
2.动态分配内存并返回指针示例:
unit_t *alloc_unit(void);
void free_unit(unit_t *p)
;
-
回调函数
void func(void (*f)(void *), void *p);
例1:实现了一个
repeat_three_times
函数,可以把调用者传来的任何回调函数连续执行三次
。
#ifndef PARA_CALLBACK_H
#define PARA_CALLBACK_H
typedef void (*callback_t)(void *);
extern void repeat_three_times(callback_t, void *);
#endif
#include "para_callback.h"
void repeat_three_times(callback_t f, void *para)
{
}
#include <stdio.h>
#include "para_callback.h"
void say_hello(void *str)
{
}
void count_numbers(void *num)
{
}
int main(void)
{
}
- 可变参数
printf
:
int printf(const char *format, ...); 确定可变参数的个数,在参数列表的末尾传一个Sentinel,例如 NULL
。下面实现一个printlist
函数,可以打印若干个传入的字符串。