成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

什么是萬能指針?詳解C語言萬能指針的妙用

開發 后端
今天跟大家介紹的知識是C語言中的void關鍵字的用法,void在大部分小伙伴的程序中都只是用于函數無參數傳入,或者無類型返回。

[[413909]]

簡單認識一下void

今天跟大家介紹的知識是C語言中的void關鍵字的用法,void在大部分小伙伴的程序中都只是用于函數無參數傳入,或者無類型返回。然而我們平時所定義的變量都會有具體的類型,int,float,char等等,那是否有void類型的變量呢?答案是:不行,編譯會出錯。如下測試代碼:

什么是萬能指針?詳解C語言萬能指針的妙用

上圖很明顯編譯器不允許定義void類型的變量,變量都是需要占用一定內存的,既然void表示無類型,編譯器自然也就不知道該為其分配多大的內存,于是造成編譯失敗。雖然void不能直接修飾變量,但是其可以用于修飾指針的指向即無類型指針void*,無類型指針那就有意義了,無類型指針不是一定要指向無類型數據,而是可以指向任意類型的數據。

void * 基本操作

大家其實在使用動態內存分配的使用就已經遇到了void *的使用,來我們一起看看如下幾個標準函數的原型定義:

  1. void* memcpy( void* _Dst, void const* _Src,size_t      _Size); 
  2. int  memcmp(void const* _Buf1,void const* _Buf2, size_t      _Size); 
  3. void* memset(void*  _Dst,int    _Val,size_t _Size ); 
  4. void*  malloc(size_t _Size); 
  5. void*  realloc( void*  _Block,size_t _Size ); 
  6. void*  calloc(size_t _Count,size_t _Size); 
  7. void  free( void* _Block ); 

上面這些函數都是與內存操作有關的函數,而void* 類型指針使用原則是: 必須要做強制類型轉換成為目標類型后才可以使用,如下測試代碼:

  1. #include <stdio.h> 
  2. #include <string.h> 
  3. #include <malloc.h> 
  4. int main() 
  5.     int num = 0; 
  6.     void* pVoid = # 
  7.     printf("%d", *(int*)pVoid);             //解引用前 必須強制類型轉換 
  8.     int* p = (int*)malloc(4);                     //賦值給目標指針 做類型轉換 
  9.     return 0; 

使用void * 實現無類型數據封裝

void既然如此的靈活一定大有用處,如果僅僅只是用來簡單地傳遞參數似乎有點大材小用,我們得把其用到上層的軟件設計上來。在一些項目中因為數據類型的不同導致重復編寫大量相同代碼,為了避免這個問題C++引入了模板這個模塊,C語言可以通過void* 類型的指針來完成,按下面我們以一個例子來跟大家介紹一種辦法能夠減少數據類型變化所帶來的程序重復代碼的增加。

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3.   /********************************************** 
  4.   *                         代碼長記不住怎么辦? 
  5.   *                         點贊關注轉發 
  6.   *                         這真的對我很重要 
  7.   **********************************************/ 
  8. typedef struct _tag_Add 
  9.     int a; 
  10.     int b; 
  11.     int result; 
  12. }sAdd; 
  13. void Add(void* param) 
  14.     sAdd * p = (sAdd*)param; 
  15.     p->result = p->a + p->b; 
  16. typedef struct _tag_Mul 
  17.     float a; 
  18.     float b; 
  19.     float result; 
  20. }sMul; 
  21. void Mul(void* param) 
  22.     sMul * p = (sMul*)param; 
  23.     p->result = p->a * p->b; 
  24. void sCal(void* param, void* fuc) 
  25.     ((void(*)(void*))fuc)(param); 
  26. int main(void) 
  27.     sAdd stAdd; 
  28.     sMul stMul; 
  29.     //數據初始化  
  30.     stAdd.a = 10; 
  31.     stAdd.b = 20; 
  32.     stMul.a = 5; 
  33.     stMul.b = 5; 
  34.     //接口直接用  
  35.     sCal(&stAdd, Add); 
  36.     sCal(&stMul, Mul); 
  37.     //對應的輸出  
  38.     printf("a + b = %d\n", stAdd.result); 
  39.     printf("a * b = %f\n", stMul.result); 
  40.     return 0; 

上面的例子可能還是無法完全彰顯void*的強悍之處了,不過其主要的作用就是為了隱藏數據類型,大家也可以理解為一種數據類型的抽象處理,這也是面向對象編程的一種體現。

最后小結

對于void這個關鍵字的使用先講這么多吧!大家一定要記得對于一些編程技巧一定要嘗試著去使用,可能達到項目目標的方式有很多種,但是一些好的設計不僅僅會讓你的代碼增色不少,同時也會讓同事們覺得你是一個喜歡專研技術的人。

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2017-04-13 07:47:06

2010-12-17 10:07:59

2010-02-05 14:36:20

C++智能指針

2015-07-27 11:34:03

Linux內核指針

2023-11-17 11:48:08

智能指針C++

2021-08-11 09:01:48

智能指針Box

2024-03-01 16:43:48

C++11智能指針內存

2023-08-07 14:09:58

數據庫開發

2022-12-22 14:56:44

2016-11-24 12:07:42

Android萬能圓角ImageView

2021-09-09 17:05:36

C++智能指針語言

2024-12-26 10:45:08

2023-12-20 12:40:51

C++RAII編程

2024-03-08 07:58:13

QPShttpsync

2010-01-27 14:18:41

Android智能指針

2022-06-27 08:36:08

PythonLambda

2014-02-17 10:56:21

Hadoop

2022-11-30 13:13:41

節能減碳PUE

2011-06-16 15:57:25

Android

2020-06-16 08:32:00

人工智能技術機器學習
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产农村妇女毛片精品久久麻豆 | 黄色国产大片 | 天天草视频 | 欧美日韩精品 | 一级黄色大片 | 免费看国产一级特黄aaaa大片 | 久久成人精品视频 | 久久久久久网站 | 午夜欧美a级理论片915影院 | 天天天操| 国产精品久久久久久久久久久久久 | 一区福利视频 | 国产精品视频999 | 天天干狠狠干 | 欧美在线视频网站 | 欧美日韩一区二区在线播放 | 免费网站国产 | 中国一级大毛片 | 国产精品国产精品国产专区不蜜 | 黄色片网站国产 | 久久久久久国产精品免费免费狐狸 | av片免费 | 一色桃子av一区二区 | 特黄毛片| 久久99精品久久久久久琪琪 | 精品国偷自产在线 | 精品国产91| 91久久久久久久久久久 | 亚洲性在线 | 日韩欧美国产一区二区三区 | 久久久久9999亚洲精品 | 欧美一级视频在线观看 | aa级毛片毛片免费观看久 | 成人在线播放 | 国产精品无码久久久久 | 九九九久久国产免费 | 久久久久久综合 | 羞羞色视频 | 国产精品美女久久久久久久网站 | 91精品国产777在线观看 | 91九色在线观看 |