欧美色综合网_狠狠色狠色综合曰曰_麻豆精品一区二区av白丝在线_久久精品综合一区

網絡消費網 >  5G > > 正文
深入理解void類型
時間:2021-12-04 10:22:04
1.空指針

一般來說,程序的起始地址是從“代碼區”的0地址開始存放的(注:如果插入一個內存分布圖,則更能說明問題,此處省略),但實際上現代操作系統并非如此,卻保留了從0開始的一塊內存。至于這塊內存到底有有多大,與具體的操作系統有關。如果程序試圖訪問這塊內存,則系統提示異常。

本文引用地址:http://www.eepw.com.cn/article/201611/322491.htm

為什么操作系統不是保留一個字節呢?由于內存管理是按頁來進行的,因此無法做到單獨保留一個字節。盡管如此,但還是有極少數系統設定RAM區從0地址開始,但指向有效變量的指針不會指向0地址。即使“代碼區”從0地址開始,但在任何情況下,0地址都不是C語言中任何函數的起始地址,因此指向有效函數地址的指針也不會指向0地址。

?課外知識延伸

雖然80C51微控制器XDATA區(外部RAM)是從0地址開始的,但只要對保存在0地址中的變量不進行取地址操作(&操作),即可有效地保證指針不會指向0地址。

與此同時,雖然32位ARM7微控制器也是從0地址開始的,但這塊內存僅用于存放中斷向量代碼,而不是程序中的有效變量地址,因此即便用空指針來判斷指針的有效性,其仍然是可行的。

基于此,于是將空指針定義為指向0地址的指針。毫無疑問,任何一種指針類型都有一個特殊的指針值,即空指針。它既不會指向任何對象或函數,也不是任何對象或函數的地址。而未初始化的指針,則完全可能指向任何地方。

由此可見,空指針與未初始化的指針是完全不同的兩個概念。那么,將如何在程序中獲得一個空指針呢?

2.空指針常量與NULL

標準C規定,在初始化、賦值或比較時,如果一邊是變量或指針類型的表達式,則編譯器可以確定另一邊的常數0為空指針,并生成正確的空指針值。即在指針上下文中“值為0的整型常量表達式”在編譯時轉換為空指針。

為了讓程序中的空指針使用更加明確,標準C專門定義了一個標準預處理宏NULL,其值為“空指針常量”,通常為0或(void *)0,即在指針上下文中NULL與0是等價的,而未加修飾的0也是完全可以接受的。由于void *指針的特殊賦值屬性,比如:

#define NULL ((void *)0)

當NULL定義為((void *)0)時,即NULL是可以賦值給任何類型指針的值,它的類型為void*,而不是整數0,因此初始化“FILE *fp = NULL;”是完全合法的。

而為了區分整數0和空指針0,當需要其它類型的0的時候,即使可能工作,但也不能使用NULL,如果這樣處理其格式是錯誤的,這在非指針上下文中是不能工作的。特別地,不能在需要ASCII空字符(NUL)的地方使用NULL。如果確實需要,則可以自定義為:

#define NUL

由此可見,常數0是一個空指針常量,而NULL僅僅是它的一個別名。

3.空指針的用途

一般來說,未初始化是不能使用的非法指針,因為它完全有可能指向任何地方,從而導致程序無法判斷它為非法指針。因此,不管指針變量是全局的還是局部的、靜態的還是非靜態的,都應該在聲明它的同時進行初始化,要么賦予一個有效的地址,要么賦予NULL。

標準C規定,全局指針變量的默認值為NULL,而對于局部指針變量則必須明確地指定其初值。因此,void通常用于指針變量的初始化,用來判斷一個指針的有效性。比如:

unsigned char *pucBuf=(void *)0;//定義pucBuf為unsigned char類型指針并初始化為空指針

如果后續的代碼忘記初始化指針而直接使用的話,則可能造成程序失敗。雖然空指針也是非法指針,但可以通過程序判斷并告訴程序員代碼可能有問題。也就是說,如果一開始就將指針初始化為空指針,則可避免程序異常。比如:

if(pucBuf==0){

return error;//如果pucBuf為空指針,則返回參數錯誤

}

由于void類型指針的不確定性,因此它可以指向任意類型的數據,那么只要在使用時做一個簡單的強制類型轉換就可以了。比如:

unsignned char*pcData = NULL;//定義pcData為unsigned char類型指針

void*pvData;//定義pvData為void類型指針

pvData = pcData;//無需進行強制類型轉換

pcData = (unsigned char*) pvData;//將pvData強制轉換為unsigned char類型指針

顯然不存在void類型的對象,也就是說,當對象為空類型時,其大小為0字節;當對象未確定類型時,那么它的大小也是未確定的,因此不能聲明void類型變量。比如:

void a;//非法聲明

既然上述聲明是非法的,那么,也就不能將sizeof運算符用于void類型。也就意味著,編譯器不知道所指對象的大小,由于指針的算術運算總是基于所指對象的大小的,因此不允許對void指針進行算術運算。

總之,在指針聲明中,void *表示通用指針的類型。如果void作為函數的返回類型,則表示不返回任何值。如果void位于參數列表中,則表示沒有參數。

4. 用無類型指針作為函數參數

由于C語言中最小長度的變量為char類型(包括unsigned char、signed char等),其sizeof(char)的結果為1,而其它任何變量的長度都是它的整數倍。比如,如果使用SDCC51編譯器,其sizeof(int)為2。因為通用swap函數函數不知道需要交換的變量的類型,所以需要一個參數給出相應的指示。由于C語言的變量類型多種多樣,因此不可能為每一種變量類型編號,而且swap并不關心變量的真正類型,所以可以用變量的長度代替變量類型。通用swap函數的原型為:

void swap(void *pvData1, void *pvData2, int iDataSize)

將a,b兩個變量(變量類型必須一樣)的值交換的代碼如下:

swap(&a, &b, sizeof(a));

通用swap排序函數的參考代碼見程序清單1.1。

程序清單1.1通用swap排序函數

1void swap (void *pvData1, void *pvData2, int iDataSize)

2{

3unsigned char *pcData1 = NULL;

4unsigned char *pcData2 = NULL;

5unsigned charucTmp1;

6

7pcData1 = (unsigned char *)pvData1;

8pcData2 = (unsigned char *)pvData2;

9

10do {

11ucTmp1 = *pcData1;

12*pcData1= *pcData2;

13*pcData2= ucTmp1;

14pcData1++;

15pcData2++;

16} while (--iDataSize >0);

17}

關鍵詞: 深入理解void類

版權聲明:
    凡注明來網絡消費網的作品,版權均屬網絡消費網所有,未經授權不得轉載、摘編或利用其它方式使用上述作品。已經本網授權使用作品的,應在授權范圍內使用,并注明"來源:網絡消費網"。違反上述聲明者,本網將追究其相關法律責任。
    除來源署名為網絡消費網稿件外,其他所轉載內容之原創性、真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考并自行核實。
熱文

網站首頁 |網站簡介 | 關于我們 | 廣告業務 | 投稿信箱
 

Copyright © 2000-2020 www.yjkq2010.com All Rights Reserved.
 

中國網絡消費網 版權所有 未經書面授權 不得復制或建立鏡像
 

聯系郵箱:920 891 263@qq.com

備案號:京ICP備2022016840號-15

營業執照公示信息

欧美色综合网_狠狠色狠色综合曰曰_麻豆精品一区二区av白丝在线_久久精品综合一区
麻豆精品精品国产自在97香蕉| 一区二区三区蜜桃网| 久久久三级国产网站| 蜜桃视频在线观看一区二区| 91精品国模一区二区三区| 午夜视黄欧洲亚洲| 日韩一级高清毛片| 国产福利91精品一区| 国产精品久久久久久久浪潮网站 | aaa亚洲精品| 中文字幕一区二区三区蜜月| 成人av中文字幕| 一区二区激情视频| 日韩欧美在线影院| 成人动漫在线一区| 亚洲一区电影777| 精品欧美一区二区在线观看| 国产 日韩 欧美大片| 亚洲精品国产视频| 日韩视频在线你懂得| 国产91精品露脸国语对白| 一区二区三区影院| 2021久久国产精品不只是精品| 99视频有精品| 久久精品99久久久| 自拍av一区二区三区| 欧美日本在线观看| 成人开心网精品视频| 亚洲精品亚洲人成人网| 欧美无砖砖区免费| 91免费观看视频在线| 国产女人aaa级久久久级| 国产馆精品极品| 欧美成人精品福利| 成人99免费视频| 日韩精品免费专区| 国产精品你懂的在线| 欧美性色黄大片| 丁香六月综合激情| 捆绑调教美女网站视频一区| 亚洲一区二区三区三| 国产欧美精品国产国产专区 | 日本一区二区免费在线| 欧美日韩色一区| 99re在线精品| 国产成人在线免费| 激情图区综合网| 青草av.久久免费一区| 一区二区三区欧美亚洲| 中文字幕日韩精品一区| 日韩欧美美女一区二区三区| 日韩精品专区在线| 日本一区二区免费在线 | 欧美一区二区三级| 亚洲青青青在线视频| 日韩欧美国产麻豆| 欧美日本国产一区| 一本一本大道香蕉久在线精品| 国产一区二区视频在线播放| 经典三级在线一区| 蜜桃一区二区三区四区| 午夜精品福利在线| 亚洲国产欧美日韩另类综合| 伊人夜夜躁av伊人久久| 亚洲视频一二三| 亚洲免费伊人电影| 亚洲欧美日韩国产综合| 综合久久给合久久狠狠狠97色| 欧美激情综合五月色丁香小说| 26uuu亚洲综合色| 久久久99久久| 国产欧美精品一区aⅴ影院| 久久日韩精品一区二区五区| 91精品国产色综合久久ai换脸| 91激情五月电影| 欧美日韩免费在线视频| 欧美电影在线免费观看| 日韩一级免费观看| 久久先锋影音av| 国产亚洲精品中文字幕| 欧美激情在线观看视频免费| 国产精品久久久久久久久免费相片 | 亚洲成人免费影院| 性欧美大战久久久久久久久| 日韩 欧美一区二区三区| 麻豆精品视频在线观看视频| 国产乱国产乱300精品| 波波电影院一区二区三区| 99久久国产综合色|国产精品| 欧美在线观看你懂的| 日韩小视频在线观看专区| 国产丝袜美腿一区二区三区| 亚洲色图另类专区| 日本欧美在线观看| 粉嫩av亚洲一区二区图片| 91视频在线看| 日韩精品最新网址| 亚洲色图欧美在线| 九一九一国产精品| av不卡在线观看| 日韩欧美国产电影| 亚洲欧洲日韩综合一区二区| 午夜激情久久久| 成人天堂资源www在线| 91福利精品第一导航| 精品国产髙清在线看国产毛片| 一区在线中文字幕| 奇米一区二区三区av| 不卡一区在线观看| 日韩欧美中文一区二区| 国产精品美女久久久久高潮| 午夜欧美一区二区三区在线播放| 国产精品456| 欧美一区二区人人喊爽| 亚洲人成网站精品片在线观看 | 日韩电影在线免费| 东方欧美亚洲色图在线| 制服丝袜中文字幕一区| 国产精品久久久久四虎| 美女国产一区二区| 色欧美片视频在线观看 | 亚洲天堂久久久久久久| 久久 天天综合| 欧美一级理论片| 亚洲精品第一国产综合野| 激情五月婷婷综合| 91精品久久久久久蜜臀| 亚洲v中文字幕| 色婷婷av一区二区三区软件 | 国产精品国产三级国产| 国产美女视频91| 日韩欧美精品在线| 日韩激情中文字幕| 欧美日韩视频在线观看一区二区三区| 成人免费视频在线观看| 99久免费精品视频在线观看 | 337p日本欧洲亚洲大胆精品 | 色综合中文字幕| 亚洲卡通动漫在线| 91视频精品在这里| 亚洲视频图片小说| 色婷婷精品大在线视频| 亚洲精品国产a| 欧美日韩电影一区| 在线一区二区观看| 国产一区二区精品在线观看| 亚洲成人动漫av| 亚洲欧洲美洲综合色网| 日韩你懂的在线观看| 91福利在线播放| 成人av高清在线| 国产精品一区二区不卡| 三级不卡在线观看| 亚洲欧美日韩一区二区| 国产人久久人人人人爽| 欧美一区二区三区男人的天堂| 97精品超碰一区二区三区| 国产美女精品人人做人人爽| 免费看日韩a级影片| 北条麻妃国产九九精品视频| 麻豆专区一区二区三区四区五区| 亚洲精品日韩综合观看成人91| 国产婷婷精品av在线| 欧美不卡一区二区三区| 在线观看国产91| 91视频精品在这里| 成人综合在线视频| 国产在线国偷精品免费看| 日韩av在线免费观看不卡| 亚洲丝袜精品丝袜在线| 日本一区二区三区在线观看| 久久色在线视频| 26uuu国产在线精品一区二区| 制服丝袜亚洲色图| 欧美三级电影网| 欧美性色黄大片| 精品视频全国免费看| 精品少妇一区二区| 日韩三级电影网址| 欧美一级欧美一级在线播放| 欧美视频自拍偷拍| 欧美色图在线观看| 欧美视频完全免费看| 在线免费不卡视频| 色偷偷久久一区二区三区| 色国产综合视频| 欧美午夜视频网站| 宅男噜噜噜66一区二区66| 欧美一二区视频| 国产专区欧美精品| 精品一区二区影视| 狠狠狠色丁香婷婷综合激情| 国产一区二区三区免费看| 久久99国内精品| 激情小说欧美图片| 粉嫩高潮美女一区二区三区| 色一情一乱一乱一91av| 欧美日韩三级一区二区| 日韩区在线观看| 中文字幕中文字幕在线一区|