1. <nobr id="easjo"><address id="easjo"></address></nobr>

      <track id="easjo"><source id="easjo"></source></track>
      1. 
        

      2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
      3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>
          貴州做網站公司
          貴州做網站公司~專業!靠譜!
          10年網站模板開發經驗,熟悉國內外開源網站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等網站程序,可為您提供網站建設,網站克隆,仿站,網頁設計,網站制作,網站推廣優化等服務。我們專注高端營銷型網站,企業官網,集團官網,自適應網站,手機網站,網絡營銷,網站優化,網站服務器環境搭建以及托管運維等。為客戶提供一站式網站解決方案?。?!

          C語言 — void的用法解析[通俗易懂]

          來源:互聯網轉載 時間:2023-12-10 16:55:52

          文章目錄

            • 一、簡介
            • 二、用法
            • 三、總結

          一、簡介

          ? void 中文翻譯為”無類型”,有的也叫”空類型”。常用在程序中對定義函數的參數類型、返回值、函數中指針類型進行聲明。

          二、用法

          首先應該注意一點的是void類型是不同于其他常見類型的,即void 類型不能夠用來申明變量和常量。因為我們申明變量的時候需要明確告訴編譯器,該變量是什么類型,比如說是int 或 char類型,這樣編譯才好為這個變量去分配存儲空間,但你不能告訴編譯器說我這是一個”空類型”,這樣的話編譯器肯定不會干的,自然你編譯的時候會報錯: "illegal use of type 'void'"。

          總的來說,void應用最廣泛的就是跟指針結合,而void和指針的結合也大大擴展了指針的可能性。

          void *	
          /*無類型指針,也稱為空指針,可以指向任何類型的數據 *注意一點:當我們需要使用void 類型的的指針變量去指向某一類型的變量的時候,必須要對其進行類型轉換 */
          

          我們在定義一個指針變量的時候第一件事就是指定我們指針變量所指向的變量的類型。一旦被指定,我們的指針變量就只能指向這一類型的變量,即只能保存這一類變量的地址。之所以這樣呢,是跟我們計算機的存儲數據的形式有關。簡單來講,就是不同類型的變量被分配的內存大小是不一樣的,當對指針變量去進行解引用的時候,就必須保證可以取出來正確的內存內容。

          第一點,我們先看一個例子,這里有一個典型的應用案例就是malloc函數,我們經常會使用到的內存申請函數。請看一個小例子:

          int *p_int;
          p_int = (int *)malloc(sizeof(int));
          

          先要說明一點的是,malloc()分配了內存,但沒有為它指定名字,但是它卻可以返回那塊內存第一個字節的地址。因此,可以把那個地址賦值給一個指針變量,并使用該指針來訪問那塊內存。因為char代表一個字節,所以傳統用法上曾將malloc()返回值定義為指向char的指針類型。然而,ANSIC標準使用了一個新類型:指向void的指針。這一類型被用作“通用指針”。

          因為malloc分配內存返回的是一個void 類型的指針,所以我們在使用的時候通常會對該指針類型進行強制轉換為我們所需要的的指針類型。這樣我們就可以使用malloc()來為我們分配任意大小的內存空間(當然了,因為malloc是在堆區分配的內存,所以我們申請的這塊內存的大小應該小于堆區的大小)。

          我們知道兩個指針變量p1,p2,只有當它們類型相同的時候才能進行互相賦值。如果p1,p2指向不同的數據類型,那么他們必須進行類型轉換才能相互賦值。比如:

          float *p1;
          int *p2;
          p1 = p2;
          

          執行上面一段程序的時候我們會發現會報錯,提示”cannot convert from 'int*' to 'float *`”,若改為

          int *p1;
          void *p2;
          p1 = p2;
          

          此時就不會報錯,因為賦值運算符的右邊進行了隱式類型轉換。當然了,我們也可以進行強制類型轉換,即使用括號進行類型轉換,比如:

          int *p1;
          void *p2;
          p1 = (int *)p2;
          

          從上面的例子可以看出,當我使用void去修飾指針的時候,這種通用類型的指針可以很方便的和其他類型的指針之間進行相關轉換。

          void另一個重要的應用則就是跟函數進行結合主要有以下兩個方面的應用。

          1. 對函數返回的限定;
          2. 對函數參數的限定;

          三、總結

          1. 如果函數沒有返回值那么應聲明為void 類型

            C語言中有一個規則,凡是不加返回值限定的函數,就會被編譯器作為整型值(int)處理。但是許多人卻誤以為其為void類型。

            因為C語言不像C++那樣有很嚴格的類型安全檢查。所以為了避免混,對于任何函數必須制定其返回值類型。如果函數沒有返回值一定要聲明為void類型。這樣既可避免混淆也方便自己和別人查看我們的代碼。

          2. 如果函數無參數,那么應該聲明其參數為void

            如果我們所寫的函數不接受任何參數,那么一定要指明其參數為void。

          3. 如果函數的參數可以是任意類型指針,那么應聲明其參數為void *

            這里有幾個比較常用到的函數,都采用了此規則。同樣,這一規則在我們日常編程中應用也很廣泛。

            /* 內存操作函數 */
            void *memcpy(void *dest, const void *src, size_t len);
            void memset(void *buffer, int c , size_t num);
            int memcmp(const void *sl, const void *s2, size_t n);
            
            /* 內存分配與釋放函數 */
            void *malloc(size_t size);
            void *calloc(size_t num, size_t size);
            void *realloc(void *ptr, size_t size);
            void free(void*ptr);
            

            可以看到我們用void 來修飾了函數參數類型,即我們可以傳任意類型指針。這也體現內存操作函數的意義,因為它操作的對象僅僅是一片內存,而不論這片內存存儲的數據是什么類型。

          4. 使用void類型指針時應該注意

            按照C標準規定,我們不能對void型指針進行運算。對有類型的指針進行算法操作的時候我們知道,因為其有具體所指向的類型,所以對其的運算是以其所指向的數據類型為單位進行的。而void的含義為空或者說無類型,所以就無法對其進行算術運算。

            運行結果為:

            我們如果要對void類型指針進行算術運算的話就必須進行類型轉換,這里有一個典型的應用案例就是malloc函數,我們經常會使用到的內存申請函數。請看一個小例子:

            先要說明一點的是,malloc()分配了內存,但沒有為它指定名字,但是它卻可以返回那塊內存第一個字節的地址。因此,可以把那個地址賦值給一個指針變量,并使用該指針來訪問該塊內存。

            因為malloc分配內存返回的是一個void 類型的指針,所以我們在使用的時候通常會對該指針類型進行強制轉換為我們所需要的的指針類型。

          5. void 不能代表一個真實的數據類型

            這個前面提到過,因為void在C語言中解釋為,或者無類型,所以它當然無法代表一個真實的數據類型了。不過我們可以對其進行類型轉換,這樣它又可以變成各種各樣的數據類型,所以我們可以將其理解成一個”抽象數據類型“。

          網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...

          在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...

          在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...

          900泰銖和1億日元是人民幣要多少錢?1泰銖=0.1761人民幣,900泰銖=158.49人民幣.1日元=0.0529人民幣,100000000日元=5290000人民幣世界各國金錢的匯率是多少?1美金=6.8345元人民幣1元=12.457元人民幣1瑞士法郎=6.206元人民幣1加元=6.435元人民幣1新加坡幣=4.823元人民幣1澳幣=5.867元人民幣1元人民幣=4.616臺幣1元人民幣=...

          U盤內存變小了是怎么回事???有三種可能會性第一:很有可能是內存量盤要是網上購買8GBU盤其神秘容量僅4G也可以更少的話,狀況多為衣服縮水U盤,也稱“快速擴容盤”。這種U盤是不法廠商可以使用一種量產中工具的軟件,決定U盤上的控制芯片信息,將U盤容量標住到遠為0其換算容量,以欺詐消費者的手段牟取暴利。當U盤的實際中容量大于或等于其標稱值的90%時,即被認為為未知質量問題的會縮水U盤。第二:換算大小和剩...

          世界二十大名表?世界十大名表勞力士到世界十大名表品牌,分別是百達翡麗、寶璣、寶珀、江詩丹頓、伯爵、積家、芝柏。排名不分先后。0-@qq.com世界十大名表勞力士到世界十大名表品牌,分別是百達翡麗、愛馬仕、寶珀、VacheronConstantin、伯爵、積家和芝柏。排名不分先后。世界上最昂貴的十大奢侈品?你知道世界上十大最昂貴的奢侈品是什么嗎?《郵報》評選出十大奢侈品。所選的奢侈品既不是瑪莎拉蒂、...

          TOP
          国产初高中生视频在线观看|亚洲一区中文|久久亚洲欧美国产精品|黄色网站入口免费进人
          1. <nobr id="easjo"><address id="easjo"></address></nobr>

              <track id="easjo"><source id="easjo"></source></track>
              1. 
                

              2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
              3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>