指針是C語言的靈魂,我們經常聽到這樣的說法,當我們初學C語言的時候,似乎覺得也沒有什么,但是當你越來越深入的了解它,你就會發現C語言的強大有時甚至超乎你的想象。C語言作為一種相對較為底層的語言,在某些方面有著不可替代的優勢。因此,要學好C語言,要深入,要精通。 C語言之回調函數 先來看下函數指針的的基礎知識,函數指針,顧名思義,就是指向函數的指針,聲明方法如下: int func(int); //函數原型 int (*pfunc)(int) = & func; //創建函數指針pfunc,并指向函數func 這里的&操作符可有可無,因為函數名本身就是一個地址。 回調函數是一個程序員不能顯式調用的函數;通過將回調函數的地址傳給調用者從而實現調用。在我們想通過一個統一接口實現不同的內容時,用回調函數非常合適。 例如:有如下用于不同設備的顯示函數 Void A_show(); Void B_show(); Void C_show(); Void show(void (*ptr)()); 使用時我們就可以將函數作為參數 show(A_show); 再舉一個經典的例子,實現在一個單鏈表中查找一個值。 Node * Search_list(Node *node,int const value) { While(node!=NULL){ if(node->value == value) break; node = node->link; } return node; } 這個函數只適用于值為整形的鏈表,因為value的值為int型,如果此時你需要在一個字符串鏈表中查找,需要編寫另外的函數來實現。這時就用到了回調函數,使查找函數與類型無關,這樣就能用于任何類型的值的鏈表。 Node * Search_list(Node *node,void const value, int (*compare)(void const * ,void const *)) { While(node!=NULL){ if(compare(&node->value,value)==0) break; node = node->link; } return node; } int compare_ints(void const *a, void const *b) { if(*(int*)a == *(int *)b) return 0; else return 1; } 我們在使用Search_list函數時,你已經知道要查找數據的數據類型了。用法如下: Desired_node = Search_list(root, &desired_value,compare_ints); 那如果你要在一個字符串鏈表中查找呢?首先你要在定義用于比較字符串一個函數: int compare_chars(void const *a, void const *b) { if(*(char*)a == *(char *)b) return 0; else return 1; } 當然你不必這樣來寫,因為C語言函數庫里面有這樣的函數 strcmp( const char *string1, const char *string2 ); 所以你就可以直接使用下面的代碼來實現在字符串鏈表中查找字符值的功能 Desired_node = Search_list(root, &desired_value, strcmp); 這樣,可以不必修改Search_list函數,而使得Search_list函數的功能更加通用。 C語言之面向對象 我們經常說C語言是面向過程的語言,而C++、JAVA是面向對象的,但是面向對象并不是C++、JAVA的專利,C語言里面也有面向對象的思想,比如我們經常使用的結構體。 struct student { char name[256]; int age; }; 學生的姓名和年齡,就是學生自身的屬性,和C++里面的成員變量是一樣的概念,但是這個結構體里面并沒有體現出方法的使用。在面向對象中有封裝的概念,結構體中的成員我們不應該直接訪問,而應該通過方法訪問,我們可以添加訪問結構體成員變量的方法。 char* get_name(student * self);//獲取學生姓名 void set_name(student * self, char* name);//設置學生姓名 char* get_name(student * self) { return self->name; } void set_name(student * self, char* name) { strncpy(self->name, name, sizeof(self->name)); } 此處省略age的設置和獲取功能。 現在類的數據、方法都有了,下一步就是要使用類創建、初始化、析構、銷毀對象,在C++中有new、delete操作符負責創建和銷毀,使用C語言實現如下: student * student _create(void);// 對象創建和初始化 void student _destroy(student * self);// 對象析構和銷毀 student * student _create(void) { student * self = malloc(sizeof(student)); memset(self->name, 0x00, sizeof(self->name)); self->age = 0; return self; } void student _destroy(student * self) { free(self); } 至此,我們就可以采用面向對象的方式來編寫代碼了。 student * student1= NULL; student1 = student _create();//創建對象 set_name(student1, "mary");//初始化student1的名字為mary set_age(student1, 20); //初始化student1的年齡為20 get_name(student1);//獲取student1的姓名 student _destroy(student1);//銷毀對象 當然C語言還有很多強大的功能,比如可變參數的函數設計,無一例外都要借助于指針來實現。以上內容參考于網絡資源,如有錯誤之處,懇請指正。 |