c函式介面

2022-10-14 18:12:08 字數 1959 閱讀 8943

c語言本質——07--函式介面

(2010-10-21 20:14:19)

**▼ 傳入引數與傳出引數

如果函式介面有指標引數,既可以把指標所指向的資料傳給函式使用(稱為傳入引數),也可以由函式填充指標所指的記憶體空間,傳回給呼叫者使用(稱為傳出引數),例如strcpy的src引數是傳入引數,dest引數是傳出引數。有些函式的指標引數同時擔當了這兩種角色,如select(2)的fd_set *引數,既是傳入引數又是傳出引數,這稱為value-result引數。

1.傳入引數示例:void func(const unit_t *p);

2.傳出引數示例:void func(unit_t *p);

引數示例:void func(unit_t *p);

傳出引數舉例:

兩層指標的引數

兩層指標也是指標,同樣可以表示傳入引數、傳出引數或者value-result引數,只不過該引數所指的記憶體空間應該解釋成乙個指標變數。

#ifndef redirect_ptr_h

#define redirect_ptr_h

extern void get_a_day(const char **);

#endif

#include "redirect_"

static const char *msg = ;

void get_a_day(const char **pp)

#include <>

#include "redirect_"

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);

**函式

如果引數是乙個函式指標,呼叫者可以傳遞乙個函式的位址給實現者,讓實現者去呼叫它,這稱為**函式(callback function)。實質即是函式指標。

**函式示例: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_"

void repeat_three_times(callback_t f, void *para)

#include <>

#include "para_"

void say_hello(void *str)

void count_numbers(void *num)

int main(void)

可變引數

只見過乙個帶有可變引數的函式printf:

int printf(const char *format, ...);

確定可變引數的個數,在引數列表的末尾傳乙個sentinel,例如null。下面實現乙個printlist函式,可以列印若干個傳入的字串。

C語言函式大全

函式名 abort 功能 異常終止乙個程序 用法 void abort void 函式名 abs 功能 求整數的絕對值 用法 int abs int i 函式名 absread,abswirte 功能 絕對磁碟扇區讀 寫資料 用法 int absread int drive,int nsects,i...

C 之虛函式

深度探索c 物件模型 是這樣來說多型的 在c 中,多型表示 以乙個public base class的指標 或引用 定址出乙個derived class object 的意思。消極多型與積極多型 用基類指標來定址繼承類的物件,我們可以這樣 point ptr new point3dpoint3d繼承...

C 中介面與實現分離的技術

在用c 寫要匯出類的庫時,我們經常只想暴露介面,而隱藏類的實現細節。也就是說我們提供的標頭檔案裡只提供要暴露的公共成員函式的宣告,類的其他所有資訊都不會在這個標頭檔案裡面顯示出來。這個時候就要用到介面與實現分離的技術。下面用乙個最簡單的例子來說明。類clxexp是我們要匯出的類,其中有乙個私有成員變...