• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            冰狼

            在努力、磨練、打擊下不斷地向著理想的財務自由方向前進

            C++復習:C基礎(結構+聯合)

            C語言中給出了另一種構造數據類型——“結構”。 它相當于其它高級語言中的記錄。“結構”是一種構造類型,它是由若干“成員”組成的。 每一個成員可以是一個基本數據類型或者又是一個構造類型。 結構既是一種“構造”而成的數據類型, 那么在說明和使用之前必須先定義它,也就是構造它。如同在說明和調用函數之前要先定義函數一樣。

            一、結構的定義
            定義一個結構的一般形式為:
            struct 結構名
            {
                成員表列
            };
            成員表由若干個成員組成, 每個成員都是該結構的一個組成部分。對每個成員也必須作類型說明,其形式為:
            類型說明符 成員名;
            成員名的命名應符合標識符的書寫規定。
            說明結構變量有以下三種方法。以上面定義的stu為例來加以說明。
            1. 先定義結構,再說明結構變量。如:
            struct stu
            {
                int num;
                char name[20];
                char sex;
                float score;
            };
            struct stu boy1,boy2;
            說明了兩個變量boy1和boy2為stu結構類型。也可以用宏定義使一個符號常量來表示一個結構類型,例如:
            #define STU struct stu
            STU
            {
                int num;
                char name[20];
                char sex;
                float score;
            };
            STU boy1,boy2;

            2. 在定義結構類型的同時說明結構變量。例如:
            struct stu
            {
                int num;
                char name[20];
                char sex;
                float score;
            }boy1,boy2;

            3. 直接說明結構變量。例如:
            struct
            {
                int num;
                char name[20];
                char sex;
                float score;
            }boy1,boy2;
              第三種方法與第二種方法的區別在于第三種方法中省去了結構名,而直接給出結構變量。三種方法中說明的boy1,boy2變量都具有圖7.1所示的結構。說明了boy1,boy2變量為stu類型后,即可向這兩個變量中的各個成員賦值。在上述stu結構定義中,所有的成員都是基本數據類型或數組類型。成員也可以又是一個結構, 即構成了嵌套的結構。例如,圖7.2給出了另一個數據結構。
            在ANSI C中除了允許具有相同類型的結構變量相互賦值以外, 一般對結構變量的使用,包括賦值、輸入、輸出、 運算等都是通過結構變量的成員來實現的。
              表示結構變量成員的一般形式是: 結構變量名.成員名
            如果結構變量是全局變量或為靜態變量, 則可對它作初始化賦值。對局部或自動結構變量不能作初始化賦值。
            數組的元素也可以是結構類型的。 因此可以構成結構型數組。結構數組的每一個元素都是具有相同結構類型的下標結構變量。

            結構指針變量的說明和使用一個指針變量當用來指向一個結構變量時, 稱之為結構指針變量。
            結構指針變量中的值是所指向的結構變量的首地址。 通過結構指針即可訪問該結構變量, 這與數組指針和函數指針的情況是相同的。結構指針變量說明的一般形式為:
            struct 結構名*結構指針變量名
            struct stu *pstu;

            當然也可在定義stu結構時同時說明pstu。與前面討論的各類指針變量相同,結構指針變量也必須要先賦值后才能使用。賦值是把結構變量的首地址賦予該指針變量, 不能把結構名賦予該指針變量。如果boy是被說明為stu類型的結構變量,則: pstu=&boy是正確的,而: pstu=&stu是錯誤的。

              結構名和結構變量是兩個不同的概念,不能混淆。 結構名只能表示一個結構形式,編譯系統并不對它分配內存空間。 只有當某變量被說明為這種類型的結構時,才對該變量分配存儲空間。 因此上面&stu這種寫法是錯誤的,不可能去取一個結構名的首地址。 有了結構指針變量,就能更方便地訪問結構變量的各個成員。

            其訪問的一般形式為: (*結構指針變量).成員名 或為:
            結構指針變量->成員名
            例如: (*pstu).num或者: pstu->num
            應該注意(*pstu)兩側的括號不可少, 因為成員符“.”的優先級高于“*”。如去掉括號寫作*pstu.num則等效于*(pstu.num),這樣,意義就完全不對了。

            結構變量.成員名
            (*結構指針變量).成員名
            結構指針變量->成員名
              這三種用于表示結構成員的形式是完全等效的。結構數組指針變量結構指針變量可以指向一個結構數組, 這時結構指針變量的值是整個結構數組的首地址。 結構指針變量也可指向結構數組的一個元素,這時結構指針變量的值是該結構數組元素的首地址。設ps為指向結構數組的指針變量,則ps也指向該結構數組的0號元素,ps+1指向1號元素,ps+i則指向i號元素。 這與普通數組的情況是一致的。


            C語言中不允許動態數組類型。例如: int n;scanf("%d",&n);int a[n]; 用變量表示長度,想對數組的大小作動態說明, 這是錯誤的。但是在實際的編程中,往往會發生這種情況, 即所需的內存空間取決于實際輸入的數據,而無法預先確定。對于這種問題, 用數組的辦法很難解決。為了解決上述問題,C語言提供了一些內存管理函數,這些內存管理函數可以按需要動態地分配內存空間, 也可把不再使用的空間回收待用,為有效地利用內存資源提供了手段。 常用的內存管理函數有以下三個:
            1.分配內存空間函數malloc
            調用形式: (類型說明符*) malloc (size) 功能:在內存的動態存儲區中分配一塊長度為"size" 字節的連續區域。函數的返回值為該區域的首地址。 “類型說明符”表示把該區域用于何種數據類型。(類型說明符*)表示把返回值強制轉換為該類型指針。“size”是一個無符號數。例如: pc=(char *) malloc (100); 表示分配100個字節的內存空間,并強制轉換為字符數組類型, 函數的返回值為指向該字符數組的指針, 把該指針賦予指針變量pc。
            2.分配內存空間函數 calloc
            calloc 也用于分配內存空間。調用形式: (類型說明符*)calloc(n,size) 功能:在內存動態存儲區中分配n塊長度為“size”字節的連續區域。函數的返回值為該區域的首地址。(類型說明符*)用于強制類型轉換。calloc函數與malloc 函數的區別僅在于一次可以分配n塊區域。例如: ps=(struet stu*) calloc(2,sizeof (struct stu)); 其中的sizeof(struct stu)是求stu的結構長度。因此該語句的意思是:按stu的長度分配2塊連續區域,強制轉換為stu類型,并把其首地址賦予指針變量ps。
            3.釋放內存空間函數free
            調用形式: free(void*ptr); 功能:釋放ptr所指向的一塊內存空間,ptr 是一個任意類型的指針變量,它指向被釋放區域的首地址。被釋放區應是由malloc或calloc函數所分配的區域。


            “聯合”與“結構”有一些相似之處。但兩者有本質上的不同。在結構中各成員有各自的內存空間, 一個結構變量的總長度是各成員長度之和。而在“聯合”中,各成員共享一段內存空間, 一個聯合變量的長度等于各成員中最長的長度。應該說明的是, 這里所謂的共享不是指把多個成員同時裝入一個聯合變量內, 而是指該聯合變量可被賦予任一成員值,但每次只能賦一種值, 賦入新值則沖去舊值。如前面介紹的“單位”變量, 如定義為一個可裝入“班級”或“教研室”的聯合后,就允許賦予整型值(班級)或字符串(教研室)。要么賦予整型值,要么賦予字符串,不能把兩者同時賦予它。聯合類型的定義和聯合變量的說明一個聯合類型必須經過定義之后, 才能把變量說明為該聯合類型。
            一、聯合的定義
            定義一個聯合類型的一般形式為:
            union 聯合名
            {
                成員表
            };
            成員表中含有若干成員,成員的一般形式為: 類型說明符 成員名 成員名的命名應符合標識符的規定。

            小結
            1. 結構和聯合是兩種構造類型數據,是用戶定義新數據類型的重要手段。結構和聯合有很多的相似之處,它們都由成員組成。成員可以具有不同的數據類型。成員的表示方法相同。都可用三種方式作變量說明。
            2. 在結構中,各成員都占有自己的內存空間,它們是同時存在的。一個結構變量的總長度等于所有成員長度之和。在聯合中,所有成員不能同時占用它的內存空間,它們不能同時存在。聯合變量的長度等于最長的成員的長度。
            3. “.”是成員運算符,可用它表示成員項,成員還可用“->”運算符來表示。
            4. 結構變量可以作為函數參數,函數也可返回指向結構的指針變量。而聯合變量不能作為函數參數,函數也不能返回指向聯合的指針變量。但可以使用指向聯合變量的指針,也可使用聯合數組。
            5. 結構定義允許嵌套,結構中也可用聯合作為成員,形成結構和聯合的嵌套。
            6. 鏈表是一種重要的數據結構,它便于實現動態的存儲分配。本章介紹是單向鏈表,還可組成雙向鏈表,循環鏈表等。

            posted on 2007-06-19 11:29 在法律保護下合法地搶銀行 閱讀(892) 評論(0)  編輯 收藏 引用 所屬分類: C++

            公告

            轉載、引用、收藏,請標明來自:

            http://m.shnenglu.com/paladino

            導航

            <2007年6月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            1234567

            統計

            留言簿(2)

            隨筆分類(10)

            文章分類(5)

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            av无码久久久久久不卡网站 | 久久综合狠狠综合久久97色| 99久久精品无码一区二区毛片| 国产精品视频久久久| 精品熟女少妇av免费久久| 97久久精品无码一区二区天美| 成人a毛片久久免费播放| 蜜臀久久99精品久久久久久| 中文精品99久久国产| 国产亚洲精品久久久久秋霞| 久久综合九色综合精品| 少妇被又大又粗又爽毛片久久黑人| 久久久SS麻豆欧美国产日韩| 国产精品久久久久久久| 合区精品久久久中文字幕一区| 久久久久人妻一区二区三区vr| 18岁日韩内射颜射午夜久久成人| 久久天天婷婷五月俺也去| 日韩人妻无码精品久久免费一| 久久这里只有精品首页| 99久久夜色精品国产网站| 国产成人精品久久综合| 久久综合噜噜激激的五月天| 婷婷久久综合九色综合九七| 国产成年无码久久久久毛片| 久久久久亚洲AV无码去区首| 久久精品人人做人人爽电影蜜月| 亚洲婷婷国产精品电影人久久| 狠狠色丁香婷婷久久综合不卡| 亚洲伊人久久成综合人影院| 国产精品伊人久久伊人电影| 久久99热只有频精品8| 青青草原综合久久大伊人| 久久亚洲国产精品五月天婷| 国产99久久九九精品无码| aaa级精品久久久国产片| 久久久久久国产精品无码超碰| 精品一二三区久久aaa片| 思思久久精品在热线热| 亚洲精品无码久久久| 久久久久久毛片免费看|