国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

C語言的一些高級議題

發布時間:2016-2-29 14:09    發布者:designapp
關鍵詞: C語言 , 指針 , 函數
  指針是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語言還有很多強大的功能,比如可變參數的函數設計,無一例外都要借助于指針來實現。以上內容參考于網絡資源,如有錯誤之處,懇請指正。
                               
               
本文地址:http://www.qingdxww.cn/thread-161443-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 5分鐘詳解定時器/計數器E和波形擴展!
  • 基于CEC1712實現的處理器SPI FLASH固件安全彈性方案培訓教程
  • 為何選擇集成電平轉換?
  • 無線充電基礎知識及應用培訓教程3
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品精品国产高清a毛片 | 九九热在线免费视频 | 性盈盈影院中文字幕 | 精品国产自在在线在线观看 | 成品人视频w免费观看w | 免费黄色欧美 | 四虎永久在线精品视频播放 | 欧美亚洲国产精品久久蜜芽 | 亚洲人xxx日本人18 | 成人免费在线播放视频 | 午夜国产理论 | 视频网站免费看 | 91福利刘玥国产在线观看 | 调教圈| 亚洲日本中文字幕天堂网 | 97国产成人精品视频 | 久久精品视频99 | 91网址 | 日韩一区二区三区四区五区 | 91视在线国内在线播放酒店 | 在线成人精品国产区免费 | 久久中文视频 | 欧美理论片手机在线观看片免费 | 日本久久不射 | 男女在床羞羞的免费视频 | 韩日在线| 99久在线观看 | 成人影院久久久久久影院 | 国产成人精品日本亚洲直接 | 就操网 | 中国一级特黄剌激爽毛片 | 四虎永久影院永久影库 | 成年看片免费高清观看 | 黄视频网站免费看 | 两个人高清在线观看www韩剧 | 久久久久久久99视频 | 91久久精品国产91久久性色也 | www.四虎影院在线观看 | 精品成人一区二区三区免费视频 | 97成人免费视频 | 成人黄激情免费视频 |