如果函數介面有指針參數,既可以把指針所指向的數據傳給函數使用(稱為傳入參數),也可以由函數填充指針所指的內存空間,傳回給調用者使用(稱為傳出參數),例如strcpy
的src
參數是傳入參數,dest
參數是傳出參數。有些函數的指針參數同時擔當了這兩種角色,如select(2)
的fd_set *
參數,既是傳入參數又是傳出參數,這稱為Value-result參數。
表 24.1. 傳入參數示例:void func(const unit_t *p);
調用者 | 實現者 |
---|---|
|
|
想一想,如果有函數介面void func(const int p);
這裡的const
有意義嗎?
表 24.3. Value-result參數示例:void func(unit_t *p);
調用者 | 實現者 |
---|---|
|
|
由於傳出參數和Value-result參數的函數介面完全相同,應該在文檔中說明是哪種參數。
以下是一個傳出參數的完整例子:
例 24.2. 傳出參數
/* populator.h */ #ifndef POPULATOR_H #define POPULATOR_H typedef struct { int number; char msg[20]; } unit_t; extern void set_unit(unit_t *); #endif
/* populator.c */ #include <string.h> #include "populator.h" void set_unit(unit_t *p) { if (p == NULL) return; /* ignore NULL parameter */ p->number = 3; strcpy(p->msg, "Hello World!"); }
/* main.c */ #include <stdio.h> #include "populator.h" int main(void) { unit_t u; set_unit(&u); printf("number: %d\nmsg: %s\n", u.number, u.msg); return 0; }
很多系統函數對於指針參數是NULL
的情況有特殊規定:如果傳入參數是NULL
表示取預設值,例如pthread_create(3)
的pthread_attr_t *
參數,也可能表示不做特別處理,例如free
的參數;如果傳出參數是NULL
表示調用者不需要傳出值,例如time(2)
的參數。這些特殊規定應該在文檔中寫清楚。