<del id="d4fwx"><form id="d4fwx"></form></del>
      <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

            <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
          • C之struct和union(十)-創(chuàng)新互聯(lián)

                在 C 語言中我們經(jīng)常會使用到 struct 和 union,那么它們兩個各自有何特點呢?今天我們就一探究竟。

            公司專注于為企業(yè)提供成都網(wǎng)站建設、成都網(wǎng)站設計、微信公眾號開發(fā)、電子商務商城網(wǎng)站建設,微信小程序定制開發(fā),軟件按需求定制網(wǎng)站等一站式互聯(lián)網(wǎng)企業(yè)服務。憑借多年豐富的經(jīng)驗,我們會仔細了解各客戶的需求而做出多方面的分析、設計、整合,為客戶設計出具風格及創(chuàng)意性的商業(yè)解決方案,成都創(chuàng)新互聯(lián)公司更提供一系列網(wǎng)站制作和網(wǎng)站推廣的服務。

                    我們先來介紹下 struct 。它可以看做是變量的集合,那么一個空的結(jié)構(gòu)體占多大內(nèi)存呢?這是一個有趣的問題,按照理論分析,它應該是0。但是按照 C 語言的設計思想來說,不可能存在空結(jié)構(gòu)體的,定義一個空結(jié)構(gòu)體沒意義啊,所以應該報錯的。下來我們就分別在 gcc 和 BCC 編譯器上實驗下。由于代碼比較簡單,就不貼代碼了,我們直接來結(jié)果。圖一為在 gcc 編譯器下編譯的,圖二為在 BCC 編譯器下編譯的。

            C之 struct 和 union(十)

                                                         圖一


            C之 struct 和 union(十)

                                                                    圖二


                    那么我們可以看到在 gcc 編譯器中,它支持我們的第一種看法,即認為占0個字節(jié)的內(nèi)存。但是在 BCC 編譯器中,它認為這樣是不合法的,定義空結(jié)構(gòu)體根本沒必要,所以直接報錯了。

                    那么我們在 C 語言中定義一個組數(shù)時,平常情況下只能定義大小是固定的數(shù)組。有沒有什么辦法讓我們在 C 語言中定義一個動態(tài)大小的數(shù)組呢?辦法當然是有的,這時我們就要用到我們的 struct 了。我們可以利用 struct 來定義一個大小待定的數(shù)組,我們稱之為柔性數(shù)組。 在 C 語言中結(jié)構(gòu)體的最后一個元素可以是大小未知的數(shù)組,那么在結(jié)構(gòu)體中的數(shù)組便是一個待使用的標識符,并不占用存儲空間。不信嗎?我們來做個實驗,代碼如下:

            #include <stdio.h>
            
            struct TS
            {
                int len;
                int array[];
            };
            
            int main()
            { 
                printf("sizeof(struct TS) = %d\n", sizeof(struct TS));
                  
                return 0;
            }

                    我們先來分析下這個代碼,結(jié)構(gòu)體 TS 中定義了一個 int 類型的變量 len,還有個大小未知的數(shù)組 array。那么這個可以編譯通過嗎?如果可以,它的大小又會是多少呢?我們來看看結(jié)果:

            C之 struct 和 union(十)

                    我們可以看到編譯器并沒有報錯,也就證明是可以這樣定義的,并且它的大小為 4 。這說明數(shù)組 array 并沒有占用內(nèi)存。下來我們來介紹下柔性數(shù)組的用法,如下圖所示

            C之 struct 和 union(十)

                    我們來使用下柔性數(shù)組,代碼如下:

            #include <stdio.h>
            #include <malloc.h>
            
            struct SoftArray
            {
                int len;
                int array[];
            };
            
            struct SoftArray* create_soft_array(int size)
            {
                struct SoftArray* ret = NULL;
                
                if( size > 0 )
                {
                    ret = (struct SoftArray*)malloc(sizeof(struct SoftArray) + sizeof(int) * size);
                    
                    ret->len = size;
                }
                
                return ret;
            }
            
            void delete_SoftArray(struct SoftArray* sa)
            {
                free(sa);
            }
            
            void func(struct SoftArray* sa)
            {
                int i = 0;
                
                if( NULL != sa )
                {
                    for(i=0; i<sa->len; i++)
                    {
                        sa->array[i] = i + 1;
                    }
                }
            }
            
            int main()
            { 
                int i = 0;
                struct SoftArray* sa = create_soft_array(5);
                
                func(sa);
                
                for(i=0; i<sa->len; i++)
                {
                    printf("sa[%d] = %d\n", i, sa->array[i]);
                }
                
                delete_SoftArray(sa);
                  
                return 0;
            }

                    我們來看下編譯后的結(jié)果

            C之 struct 和 union(十)

                    我們已經(jīng)成功實現(xiàn)了一個柔性數(shù)組,可以自己指定這個數(shù)組的大小了。


                    下來我們來介紹下 C 語言中的 union,它在語法上跟 struct 很像。但是 union 只分配大的成員變量的空間,所有成員共享這個空間。union 的使用受系統(tǒng)大小端的影響,我們來看看系統(tǒng)的大小端內(nèi)存是怎樣分配的,如下圖所示:

            C之 struct 和 union(十)

                    那么在小端模式下,數(shù)據(jù)存儲在低位地址上。大端則相反,但是我們的程序取數(shù)據(jù)總是從低地址開始取的。在上圖中的程序中,如果系統(tǒng)是小端,則輸出為 1,反之則為 0。根據(jù) union 這個特性,我們可以寫一個判斷系統(tǒng)大小端的函數(shù)。這道題也是筆試中我們經(jīng)常會見到的,代碼如下:

            #include <stdio.h>
            
            int System_mode()
            {
                union SM
                {
                    int i;
                    char c;
                };
                
                union SM sm;
                
                sm.i = 1;
                
                return sm.c;
            }
            
            int main()
            { 
                if( 1 == System_mode() )
                {
                    printf("小端模式\n");
                }
                else
                {
                    printf("大端模式\n");
                }
                  
                return 0;
            }

                    我們編譯后結(jié)果如下:

            C之 struct 和 union(十)

                    那么我們本節(jié)學習了 struct 和 union 的有關特性,通過本節(jié)學習,總結(jié)如下:1、struct 中每個數(shù)據(jù)成員有獨立的存儲空間,可以通過最后的數(shù)組標識符產(chǎn)生柔性數(shù)組;2、union 中所有的數(shù)據(jù)成員共享同一個存儲空間,同時它的使用會受到系統(tǒng)大小端的影響。后面我們會繼續(xù)對 C 語言的學習。

                     歡迎大家一起來學習 C 語言,可以加我QQ:243343083。


            另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

            文章名稱:C之struct和union(十)-創(chuàng)新互聯(lián)
            網(wǎng)頁鏈接:http://www.jbt999.com/article38/djjhsp.html

            成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、定制開發(fā)、App設計品牌網(wǎng)站設計、企業(yè)網(wǎng)站制作、用戶體驗

            廣告

            聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

            成都定制網(wǎng)站建設

              <del id="d4fwx"><form id="d4fwx"></form></del>
              <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

                    <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
                  • 婷婷丁香亚洲 | 久久亚洲Av夜福利精品一区 | 中文字幕黄色片 | 夜丝袜噜噜亚洲精品AV | 热久久综合免费频99热 |