大家好,我是 1、使用宏給結(jié)構(gòu)體初始化如果頻繁使用一個(gè)結(jié)構(gòu)體的話,使用使用宏來給結(jié)構(gòu)體進(jìn)行賦值是很方便的一種做法。 例子:左右滑動查看全部代碼>>> #include <stdio.h> 編譯、運(yùn)行結(jié)果:這種方法在RT-Thread的底層gpio驅(qū)動中也有見到: 2、結(jié)構(gòu)體內(nèi)置函數(shù)指針我們常常構(gòu)造一些結(jié)構(gòu)體來存儲數(shù)據(jù),然后在一些函數(shù)中使用這些結(jié)構(gòu)體。下次不妨把數(shù)據(jù)與操作數(shù)據(jù)的函數(shù)綁在一起,更清晰明了。 例子:左右滑動查看全部代碼>>> #include <stdio.h> 編譯、運(yùn)行結(jié)果:3、void*之前在C語言對象編程第一彈:封裝與抽象中有用過 左右滑動查看全部代碼>>> void *malloc(size_t size) ;
我們平時(shí)在封裝自己的函數(shù)時(shí),也可以多考慮看看有沒有必要使用 4、動態(tài)綁定、回調(diào)函數(shù)回調(diào)函數(shù)可以達(dá)到動態(tài)綁定的作用,在一定程度上可以降低層與層之間的耦合。關(guān)于回調(diào)函數(shù),之前已經(jīng)有寫過一篇:C語言、嵌入式重點(diǎn)知識:回調(diào)函數(shù)。但有很多初學(xué)的小伙伴可能還不理解回調(diào)函數(shù),可以借助下圖來理解: 一般函數(shù)調(diào)用的順序都是上層函數(shù)(調(diào)用者)調(diào)用下層函數(shù)(被調(diào)用者)。 而通過上圖我們可以看到下層模塊的函數(shù)2調(diào)用了上層模塊的函數(shù)3,這個(gè)調(diào)用過程與一般的調(diào)用過程相反,這個(gè)過程叫做回調(diào),這里上層模塊的函數(shù)3就是回調(diào)函數(shù)?;卣{(diào)函數(shù)的表現(xiàn)形式是函數(shù)指針。 C庫stdlib.h中帶有一個(gè)排序函數(shù):qsort函數(shù)。這個(gè)排序函數(shù)的原型為: void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*)); 參數(shù):
int compar(const void *p1, const void *p2); 如果compar返回值小于0(< 0),那么p1所指向元素會被排在p2所指向元素的左面; 如果compar返回值等于0(= 0),那么p1所指向元素與p2所指向元素的順序不確定; 如果compar返回值大于0(> 0),那么p1所指向元素會被排在p2所指向元素的右面。 例子:左右滑動查看全部代碼>>> #include <stdio.h> 編譯、運(yùn)行結(jié)果: 以上就是本次的分享,如有錯誤,歡迎指出,謝謝。 這是第一彈,后續(xù)還會繼續(xù)分享更多實(shí)際開發(fā)中實(shí)用的編程小技巧及編程經(jīng)驗(yàn),歡迎持續(xù)關(guān)注。本文只是盤點(diǎn)了一些實(shí)用小技巧,并不是說無論什么場景下都要這么用,別濫用,還需具體問題具體分析。 |
|