如果函数接口有指针参数,既可以把指针所指向的数据传给函数使用(称为传入参数),也可以由函数填充指针所指的内存空间,传回给调用者使用(称为传出参数),例如strcpy的函数原型为
char *strcpy(char *dest, const char *src);
其中src参数是传入参数,dest参数是传出参数。有些函数的指针参数同时担当了这两种角色,如select函数。其函数原型为:
int select(int nfds, fd_set *readfds,fd_set *writefds,
fd_set *exceptfds, struct timeval*timeout);
其中的fd_set *参数,既是传入参数又是传出参数,这称为Value-result参数。
传入参数示例:
假如我们实现一个函数,其参数通过地址来传入一个值,其原型如下:
void func(const unit_t *p);
其调用者与实现者之间的协议如下:
调用者 |
实现者 |
1、分配p所指的内存空间; 2、在p所指的内存空间中保存数据; 3、调用函数; 4、由于有const限定符,调用者可以确信p所指的内存空间不会被改变。 |
1、规定指针参数的类型unit_t *; 2、读取p所指的内存空间。 |
传出参数示例:
假如我们实现一个函数,其参数通过地址传出一个值,其原型如下:
void func(unit_t *p);
其调用者与实现者之间的协议如下:
调用者 |
实现者 |
1、分配p所指的内存空间 2、调用函数 3、读取p所指的内存空间 |
1、规定指针参数的类型unit_t * 2、在p所指的内存空间中保存数据
|
Value-result参数示例:
void func(unit_t *p);
其调用者与实现者之间的协议如下:
调用者 |
实现者 |
1、分配p所指的内存空间 2、在p所指的内存空间保存数据 |