日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

void和void*详解 v2

發(fā)布時間:2025/3/12 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 void和void*详解 v2 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

void的含義

void即“無類型”,void *則為“無類型指針”,可以指向任何數(shù)據(jù)類型。

void
指針使用規(guī)范
①void
指針可以指向任意類型的數(shù)據(jù),亦即可用任意數(shù)據(jù)類型的指針對void指針賦值。例如:
int * pint;
void *pvoid;
pvoid = pint; /*?
不過不能?pint= pvoid; */
如果要將pvoid賦給其他類型指針,則需要強制類型轉(zhuǎn)換如:pint= (int *)pvoid;

ANSIC標準中,不允許對void指針進行算術(shù)運算如pvoid++pvoid+=1等,而在GNU中則允許,因為在缺省情況下,GNU認為void *char *一樣。sizeof(*pvoid )== sizeof( char).

void
的作用
對函數(shù)返回的限定。
對函數(shù)參數(shù)的限定。
當函數(shù)不需要返回值時,必須使用void限定。例如:?void func(int, int);
當函數(shù)不允許接受參數(shù)時,必須使用void限定。例如:?int func(void)

由于void指針可以指向任意類型的數(shù)據(jù),亦即可用任意數(shù)據(jù)類型的指針對void指針賦值,因此還可以用void指針來作為函數(shù)形參,這樣函數(shù)就可以接受任意數(shù)據(jù)類型的指針作為參數(shù)。例如:
void * memcpy( void *dest, const void *src, size_t len );
void * memset( void * buffer, int c, size_t num);

------------------------------------------------------------------------------


1. 綜述

許多初學者對C/C++語言中的voidvoid指針類型不甚理解,因此在使用上出現(xiàn)了一些錯誤。本文將對void關(guān)鍵字的深刻含義進行解說,并詳述voidvoid指針類型的使用方法與技巧。

2.void的含義

  void的字面意思是“無類型”,void*則為“無類型指針”,void*可以指向任何類型的數(shù)據(jù)。void幾乎只有“注釋”和限制程序的作用,因為從來沒有人會定義一個void變量,讓我們試著來定義:
void a;
  這行語句編譯時會出錯,提示“illegal use of type’void’”。不過,即使voida的編譯不會出錯,它也沒有任何實際意義。
  void真正發(fā)揮的作用在于:
  (1)對函數(shù)返回的限定;
  (2)對函數(shù)參數(shù)的限定。
   眾所周知,如果指針p1p2的類型相同,那么我們可以直接在p1p2間互相賦值;如果p1p2指向不同的數(shù)據(jù)類型,則必須使用強制類型轉(zhuǎn)換運算符把賦值運算符右邊的指針類型轉(zhuǎn)換為左邊指針的類型。
  例如:
float * p1;
in t* p2;
p1 = p2;
  其中p1 = p2語句會編譯出錯,提示“’=’:cannotconvertfrom’int *’to’float *’”,必須改為:
p1=(float*)p2;
void*則不同,任何類型的指針都可以直接賦值給它,無需進行強制類型轉(zhuǎn)換:
void * p1;
int * p2;
p1 = p2;
  但這并不意味著,void*也可以無需強制類型轉(zhuǎn)換地賦給其它類型的指針。因為“無類型”可以包容“有類型”,而“有類型”則不能包容“無類型”。道理很簡單,我們可以說“男人和女人都是人”,但不能說“人是男人”或者“人是女人”。下面的語句編譯出錯:
void * p1;
int * p2;
p2 = p1;


  提示“’=’:cannotconvertfrom’void*’to’int*’”

3.void的使用

  下面給出 void 關(guān)鍵字的使用規(guī)則:
  規(guī)則一如果函數(shù)沒有返回值,那么應聲明為 void 類型
  在 C 語言中,凡不加返回值類型限定的函數(shù),就會被編譯器作為返回整型值處理。但是許多程序員卻誤以為其為 void 類型。例如:
add(inta,intb)
{
return a+b;
}
int main(int argc,char * argv[])
{
printf(/"2+3=%d/",add(2,3));
}
  程序運行的結(jié)果為輸出:
   2+3=5
  這說明不加返回值說明的函數(shù)的確為 int 函數(shù)。
  林銳博士《高質(zhì)量 C/C++ 編程》中提到:“ C++ 語言有很嚴格的類型安全檢查,不允許上述情況(指函數(shù)不加類型聲明)發(fā)生”。可是編譯器并不一定這么認定,譬如在 VisualC++6.0 中上述 add 函數(shù)的編譯無錯也無警告且運行正確,所以不能寄希望于編譯器會做嚴格的類型檢查。
  因此,為了避免混亂,我們在編寫 C/C++ 程序時,對于任何函數(shù)都必須一個不漏地指定其類型。如果函數(shù)沒有返回值,一定要聲明為 void 類型。這既是程序良好可讀性的需要,也是編程規(guī)范性的要求。另外,加上 void 類型聲明后,也可以發(fā)揮代碼的“自注釋”作用。代碼的“自注釋”即代碼能自己注釋自己。? [Page]
規(guī)則二如果函數(shù)無參數(shù),那么應聲明其參數(shù)為 void
  在 C++ 語言中聲明一個這樣的函數(shù):
int function(void)
{
return1;
}
  則進行下面的調(diào)用是不合法的:
function(2);
  因為在 C++ 中,函數(shù)參數(shù)為 void 的意思是這個函數(shù)不接受任何參數(shù)。
我們在 TurboC2.0 中編譯:
#include"stdio.h"
fun()
{
return1;
}
main()
{
printf(/"%d/",fun(2));
getchar();
}
  編譯正確且輸出 1 ,這說明,在 C 語言中,可以給無參數(shù)的函數(shù)傳送任意類型的參數(shù),但是在 C++ 編譯器中編譯同樣的代碼則會出錯。在 C++ 中,不能向無參數(shù)的函數(shù)傳送任何參數(shù),出錯提示“’ fun’:functiondoesnottake1parameters”
  所以,無論在 C 還是 C++ 中,若函數(shù)不接受任何參數(shù),一定要指明參數(shù)為 void
  規(guī)則三小心使用 void 指針類型
  按照 ANSI(AmericanNationalStandardsInstitute) 標準,不能對 void 指針進行算法操作,即下列操作都是不合法的:
void * pvoid;
pvoid ++;//ANSI
:錯誤
pvoid += 1;//ANSI
:錯誤
ANSI
標準之所以這樣認定,是因為它堅持:進行算法操作的指針必須是確定知道其指向數(shù)據(jù)類型大小的。 例如:
int * pint;
pint ++;//ANSI
:正確
pint++ 的結(jié)果是使其增大 sizeof(int)
但是大名鼎鼎的 GNU(GNU’sNotUnix 的縮寫 ) 則不這么認定,它指定 void *? 的算法操作與 char *? 一致。
因此下列語句在 GNU 編譯器中皆正確:
pvoid ++;//GNU
:正確
pvoid += 1;//GNU
:正確
   pvoid++ 的執(zhí)行結(jié)果是其增大了 1
  在實際的程序設計中,為迎合 ANSI 標準,并提高程序的可移植性,我們可以這樣編寫實現(xiàn)同樣功能的代碼:
void * pvoid;
(char*)pvoid ++;//ANSI
:正確; GNU :正確
(char*)pvoid += 1;//ANSI
:錯誤; GNU :正確
   GNU ANSI 還有一些區(qū)別,總體而言, GNU ANSI 更“開放”,提供了對更多語法的支持。但是我們在真實設計時,還是應該盡可能地迎合 ANSI 標準。
  規(guī)則四如果函數(shù)的參數(shù)可以是任意類型指針,那么應聲明其參數(shù)為 void*
  典型的如內(nèi)存操作函數(shù) memcpy memset 的函數(shù)原型分別為:
void * memcpy(void*dest,constvoid*src,size_tlen);

void * memset(void*buffer,intc,size_tnum);


  這樣,任何類型的指針都可以傳入memcpymemset中,這也真實地體現(xiàn)了內(nèi)存操作函數(shù)的意義,因為它操作的對象僅僅是一片內(nèi)存,而不論這片內(nèi)存是什么類型。如果?memcpymemset的參數(shù)類型不是void*,而是char*,那才叫真的奇怪了!這樣的memcpymemset明顯不是一個“純粹的,脫離低級趣味的”函數(shù)!


下面的代碼執(zhí)行正確:
//
示例:memset接受任意類型指針
int intarray[100];[Page]
memset(intarray,0,100*sizeof(int));//
intarray0
//
示例:memcpy接受任意類型指針
int intarray1[100],intarray2[100];
memcpy(intarray1,intarray2,100*sizeof(int));//
intarray2拷貝給intarray1
  有趣的是,memcpymemset函數(shù)返回的也是void*類型,標準庫函數(shù)的編寫者是多么地富有學問啊!
  規(guī)則五void不能代表一個真實的變量
  下面代碼都企圖讓void代表一個真實的變量,因此都是錯誤的代碼:
void a;//
錯誤
function(void a);//
錯誤
  void體現(xiàn)了一種抽象,這個世界上的變量都是“有類型”的,譬如一個人不是男人就是女人(還有人妖?)。
  void的出現(xiàn)只是為了一種抽象的需要,如果你正確地理解了面向?qū)ο笾小俺橄蠡悺钡母拍?#xff0c;也很容易理解void數(shù)據(jù)類型。正如不能給抽象基類定義一個實例,我們也不能定義一個void(讓我們類比的稱void為“抽象數(shù)據(jù)類型”)變量。

4.總結(jié)

  小小的void蘊藏著很豐富的設計哲學,作為一名程序設計人員,對問題進行深一個層次的思考必然使我們受益匪淺

總結(jié)

以上是生活随笔為你收集整理的void和void*详解 v2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91av视频免费观看 | 亚洲综合一区二区三区 | 9久久9毛片又大又硬又粗 | 女人叫床高潮娇喘声录音mp3 | 少妇高潮a一级 | 亚欧成人精品 | aaa影院 | 巨胸爆乳美女露双奶头挤奶 | 欧洲av一区二区 | 老司机在线永久免费观看 | 国产欧美成人 | 一级在线观看 | 亚洲自拍偷拍精品 | 亚洲女人视频 | 亚洲视频一区在线 | 在线成人看片 | 精品一区二区视频在线观看 | 国产无套丰满白嫩对白 | 成人教育av | 日韩毛片免费观看 | 国产精品扒开腿做爽爽爽男男 | 久久精品国产亚洲AV高清综合 | 免费的一级黄色片 | 精品人妻一区二区三区麻豆91 | 亚洲蜜桃精久久久久久久久久久久 | 婷婷午夜激情 | aa一级黄色片 | 奇米精品一区二区三区在线观看 | 久久久久久久久久久久久久久久久久久 | 杏导航aⅴ福利网站 | 一道本在线观看 | 影音先锋蜜桃 | 亚洲女同在线 | 精品久久久久中文慕人妻 | 日本wwww色 | 中文字字幕| 欧美在线视频不卡 | 欧美 变态 另类 人妖 | 国产av无码专区亚洲a∨毛片 | 丰满熟女人妻一区二区三区 | 国产欧美日韩91 | 国产精品高潮呻吟视频 | 中文字幕日韩精品亚洲一区小树林 | xxxxx在线| 国产一级网站 | 一个人在线免费观看www | 欧美日韩精品免费 | 国产精品18久久久 | mm131美女大尺度私密照尤果 | 成人18网站 | 天天干狠狠干 | 精品少妇人妻av一区二区三区 | 中文字幕综合网 | 欧美成人精品在线 | 国产丝袜网站 | 香蕉色综合| 日本无翼乌邪恶大全彩h | 亚洲色图第三页 | 91福利在线视频 | 草草影院国产第一页 | 麻豆一区二区在线 | 中文字幕综合网 | 欧美精品v国产精品v日韩精品 | 日韩一区二区在线播放 | 免费观看黄色网址 | 午夜免费片 | 亚洲成人网在线播放 | 婷婷狠狠操 | 国产精品xxx在线 | 欧美一级特黄aaaaaa大片在线观看 | 激情插插 | 绯色av一区 | 992tv在线成人免费观看 | 国产美女裸体无遮挡免费视频 | 免费三级网 | 色视av | 中文字幕不卡在线观看 | 720url在线观看免费版 | 日本东京热一区二区三区 | 穿扒开跪着折磨屁股视频 | 草莓视频在线观看入口w | 成人性生交视频免费观看 | 伊人色影院 | 国产香蕉97碰碰碰视频在线观看 | 国产一级做a爰片在线看免费 | xx色综合| 国产精品一区一区三区 | 97香蕉久久超级碰碰高清版 | 成人夜夜 | 成人午夜在线 | 夜色一区| 人妻丰满熟妇av无码久久洗澡 | 黄色网页在线免费观看 | 日韩男女视频 | 91精品国产乱码久久久 | 欧美成人三级精品 | 黑名单上的人全集免费观看 | 国产一区二区激情 | 国产成人精品午夜福利Av免费 |