第11章 復(fù)雜數(shù)據(jù)類(lèi)型-清華大學(xué)C語(yǔ)言_第1頁(yè)
第11章 復(fù)雜數(shù)據(jù)類(lèi)型-清華大學(xué)C語(yǔ)言_第2頁(yè)
第11章 復(fù)雜數(shù)據(jù)類(lèi)型-清華大學(xué)C語(yǔ)言_第3頁(yè)
第11章 復(fù)雜數(shù)據(jù)類(lèi)型-清華大學(xué)C語(yǔ)言_第4頁(yè)
第11章 復(fù)雜數(shù)據(jù)類(lèi)型-清華大學(xué)C語(yǔ)言_第5頁(yè)
已閱讀5頁(yè),還剩62頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第11章復(fù)雜數(shù)據(jù)類(lèi)型制作人:王敬華C數(shù)據(jù)類(lèi)型指針類(lèi)型空類(lèi)型void定義類(lèi)型typedef構(gòu)造類(lèi)型枚舉類(lèi)型enum數(shù)組結(jié)構(gòu)體struct共用體union基本類(lèi)型字符類(lèi)型char實(shí)型單精度型float雙精度型double整型短整型short長(zhǎng)整型long整型int語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C只能定義單一的數(shù)據(jù)類(lèi)型,反映事物單一屬性第11章:復(fù)雜數(shù)據(jù)類(lèi)型學(xué)習(xí)的意義

如定義學(xué)生成績(jī):

floatscore;能定義復(fù)雜的數(shù)據(jù)類(lèi)型,反映事物多個(gè)屬性如定義學(xué)生信息:structSTU{charno[9];//學(xué)號(hào)

charname[12];//姓名

charsex;//性別

floatscore;//成績(jī)}student;復(fù)雜數(shù)據(jù)類(lèi)型豐富了C語(yǔ)言對(duì)數(shù)據(jù)信息的處理能力。離開(kāi)了復(fù)雜數(shù)據(jù)類(lèi)型,很多信息的描述是無(wú)法進(jìn)行定義,更無(wú)法進(jìn)行處理的。計(jì)算機(jī)中的信息表示更多是由復(fù)雜數(shù)據(jù)類(lèi)型來(lái)定義的,象《數(shù)據(jù)結(jié)構(gòu)》課程中的鏈表、樹(shù)、圖等可以更好地理解數(shù)據(jù)庫(kù)中的記錄的含義,為C++語(yǔ)言中類(lèi)的概念的理解提供了幫助。學(xué)習(xí)目標(biāo)

熟練掌握結(jié)構(gòu)體、共用體和枚舉數(shù)據(jù)類(lèi)型的定義方法;熟練掌握結(jié)構(gòu)體、共用體和枚舉變量的定義和引用方法;掌握結(jié)構(gòu)數(shù)組的定義及其應(yīng)用;掌握指向結(jié)構(gòu)的指針的概念及其應(yīng)用;了解線(xiàn)性鏈表的創(chuàng)建、插入節(jié)點(diǎn)、刪除節(jié)點(diǎn)和撤銷(xiāo)節(jié)點(diǎn)的算法;掌握利用復(fù)雜數(shù)據(jù)類(lèi)型作為函數(shù)參數(shù)和返回值的函數(shù)定義方法;語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C學(xué)習(xí)內(nèi)容

復(fù)雜數(shù)據(jù)類(lèi)型概述結(jié)構(gòu)體結(jié)構(gòu)體類(lèi)型的定義結(jié)構(gòu)體變量的定義和引用結(jié)構(gòu)體變量的賦值簡(jiǎn)化結(jié)構(gòu)體類(lèi)型名結(jié)構(gòu)體數(shù)組線(xiàn)性鏈表聯(lián)合體聯(lián)合體類(lèi)型的定義聯(lián)合體變量的定義和引用聯(lián)合體變量的賦值位域枚舉類(lèi)型變量的定義和引用復(fù)雜數(shù)據(jù)類(lèi)型應(yīng)用綜合舉例本章小結(jié)語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C11.1結(jié)構(gòu)體結(jié)構(gòu)體是一種構(gòu)造數(shù)據(jù)類(lèi)型

用途:把不同類(lèi)型的數(shù)據(jù)組合成一個(gè)整體-------自定義數(shù)據(jù)類(lèi)型

引入結(jié)構(gòu)體的好處:加強(qiáng)數(shù)據(jù)項(xiàng)之間的聯(lián)系

如學(xué)生的基本信息,包括學(xué)號(hào)、姓名、性別、年齡、班級(jí)、成績(jī)等數(shù)據(jù)項(xiàng)。這些數(shù)據(jù)項(xiàng)描述了一個(gè)學(xué)生的幾個(gè)不同側(cè)面。nonamesexageclassnograde獨(dú)立的變量表示:

數(shù)據(jù)項(xiàng)之間無(wú)關(guān)聯(lián)nonamesexageclassnograde結(jié)構(gòu)體變量表示:

數(shù)據(jù)項(xiàng)為一個(gè)整體charno[9];//學(xué)號(hào)charname[20];//姓名charsex;//性別unsignedintage;//年齡unsignedint

classno;//班級(jí)floatgrade;//成績(jī)語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C1、結(jié)構(gòu)體類(lèi)型的定義struct[結(jié)構(gòu)體類(lèi)型名]{

數(shù)據(jù)類(lèi)型名1成員名1;數(shù)據(jù)類(lèi)型名2成員名2;

……

數(shù)據(jù)類(lèi)型名n成員名n;};struct是關(guān)鍵字,不能省略合法標(biāo)識(shí)符可省:無(wú)名結(jié)構(gòu)體成員類(lèi)型可以是基本型或構(gòu)造型以分號(hào);結(jié)尾

例1:struct

Student_Info{charno[9];//學(xué)號(hào)

charname[20];//姓名

charsex;//性別

unsignedintage;//年齡

unsignedint

classno;//班級(jí)

floatgrade;//成績(jī)};例2:structDate{

intyear;//年

intmonth;//月

intday;//日};語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C在結(jié)構(gòu)體中數(shù)據(jù)類(lèi)型相同的成員,既可逐個(gè)、逐行分別定義,也可合并成一行定義,就象一次定義多個(gè)變量一樣。struct

Student_Info{charno[9];//學(xué)號(hào)

charname[20];//姓名

charsex;//性別

unsignedintage;//年齡

unsignedint

classno;//班級(jí)

floatgrade;//成績(jī)};struct

Student_Info{charno[9],name[20],sex;unsignedintage,classno;floatgrade;};structDate{

intyear;//年

intmonth;//月

intday;//日};structDate{

intyear,month,day;};

注意:結(jié)構(gòu)類(lèi)型只是用戶(hù)自定義的一種數(shù)據(jù)類(lèi)型,用來(lái)定義描述結(jié)構(gòu)的組織形式,不分配內(nèi)存,只有用它來(lái)定義某個(gè)變量時(shí),才會(huì)為該變量分配結(jié)構(gòu)類(lèi)型所需要大小的內(nèi)存單元。語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型Cstruct

Student_Info{charno[9],name[20],sex;unsignedintage,classno;floatgrade;};struct

Student_Infostudent;例:2、結(jié)構(gòu)體變量的定義和引用struct

結(jié)構(gòu)體類(lèi)型名{

數(shù)據(jù)類(lèi)型名1成員名1;

……

數(shù)據(jù)類(lèi)型名n成員名n;};struct

結(jié)構(gòu)體類(lèi)型名變量名列表;結(jié)構(gòu)體變量的定義間接定義法:先定義結(jié)構(gòu)類(lèi)型,再定義結(jié)構(gòu)變量

……9字節(jié)20字節(jié)1字節(jié)2字節(jié)2字節(jié)4字節(jié)nonamesexageclassnograde內(nèi)存映像(BC下)語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型Cstruct

student;struct

Student_Info

student1,student2;一次定義多個(gè)結(jié)構(gòu)體類(lèi)型變量

定義指向結(jié)構(gòu)體類(lèi)型的指針變量

struct

Student_Info

*pstu;間接定義法中幾種錯(cuò)誤的結(jié)構(gòu)體變量的定義方法

沒(méi)有結(jié)構(gòu)體類(lèi)型名Student_Infostudent;

缺省struct關(guān)鍵字

structPointp;structPoint{

intx,y;};

結(jié)構(gòu)類(lèi)型Point定義在后

語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C2、結(jié)構(gòu)體變量的定義和引用struct[結(jié)構(gòu)體類(lèi)型名]{

數(shù)據(jù)類(lèi)型名1成員名1;

……

數(shù)據(jù)類(lèi)型名n成員名n;}變量名列表;結(jié)構(gòu)體變量的定義直接定義法:定義結(jié)構(gòu)體類(lèi)型的同時(shí)定義結(jié)構(gòu)體變量

struct

Student_Info{charno[9];//學(xué)號(hào)

charname[20];//姓名

charsex;//性別

unsignedintage;//年齡

unsignedint

classno;//班級(jí)

floatgrade;//成績(jī)}student1,student2;struct{charno[9];//學(xué)號(hào)

charname[20];//姓名

charsex;//性別

unsignedintage;//年齡

unsignedint

classno;//班級(jí)

floatgrade;//成績(jī)}student1,student2;或無(wú)名結(jié)構(gòu)體定義,變量只能一次語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C幾點(diǎn)說(shuō)明:(1)結(jié)構(gòu)體類(lèi)型與結(jié)構(gòu)體變量概念不同

類(lèi)型:不分配內(nèi)存;

變量:分配內(nèi)存

類(lèi)型:不能賦值、存取、運(yùn)算;

變量:可以(2)結(jié)構(gòu)體可以嵌套

例:

structdate{

intmonth;

intday;

intyear;};structstudent{

intnum;charname[20];

structdatebirthday;}stu;numnamebirthdaymonthdayyear例:

structstudent{

intnum;charname[20];

structdate

{

intmonth;

intday;

intyear;}

birthday;}stu;numnamebirthdaymonthdayyearstructPoint{

intx,y;};struct

Img{

inttag;

struct

Img*pimg;//正確,可以包含自身類(lèi)型的指針

struct

Img

img;//錯(cuò)誤,不能包含自身類(lèi)型的變量};(3)結(jié)構(gòu)類(lèi)型中的成員名,可以與程序中的變量同名,它們代表不同的對(duì)象,互不干擾

struct

Student_Infostudent;charname[20];(4)結(jié)構(gòu)體類(lèi)型及變量的作用域和生存期與基本類(lèi)型變量相同

語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C例

structstudent{

intnum;charname[20];charsex;

intage;floatscore;charaddr[30];}stu1,stu2;if(stu1==stu2)……..()例

structstudent{

intnum;charname[20];charsex;

intage;floatscore;charaddr[30];}stu,*pstu=&stu;strcpy(,"zhangMing");

stu.score=80;

pstu->score+=10;

printf("%s%f",,(*pstu).score);

結(jié)構(gòu)體變量的引用引用規(guī)則結(jié)構(gòu)體變量不能整體引用,只能引用變量成員引用方式:結(jié)構(gòu)體變量名.成員名//非指針型結(jié)構(gòu)體變量的引用可以將一個(gè)結(jié)構(gòu)體變量賦值給另一個(gè)結(jié)構(gòu)體變量結(jié)構(gòu)體嵌套時(shí)逐級(jí)引用結(jié)構(gòu)體指針->成員名或(*結(jié)構(gòu)體指針).成員名//指針型結(jié)構(gòu)體變量的引用成員(分量)運(yùn)算符結(jié)合性:從左向右成員(分量)運(yùn)算符結(jié)合性:從左向右例

structstudent{

intnum;charname[20];charsex;

intage;floatscore;charaddr[30];}stu1,stu2;

stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score;stu1.age++;例

structstudent{

intnum;charname[20];charsex;

intage;floatscore;charaddr[30];}stu1,stu2;printf(“%d,%s,%c,%d,%f,%s\n”,stu1);()stu1={101,“WanLin”,‘M’,19,87.5,“DaLian”};()結(jié)構(gòu)體變量名.成員名.子成員名……最低級(jí)子成員名例

structstudent{

intnum;charname[20];charsex;

intage;floatscore;charaddr[30];}stu1,stu2;Stu2=stu1;(√)例

structstudent{

intnum;charname[20];

structdate{

intmonth;

intday;

intyear;}

birthday;}stu1,stu2,*pstu=&stu1;numnamebirthdaymonthdayyearstu1.birthday.month=12;pstu1->birthday.year=2008;注意:在利用指針引用結(jié)構(gòu)體成員時(shí),-和>之間不能有空格。語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C3、結(jié)構(gòu)體變量的賦值結(jié)構(gòu)體變量初始化賦值先定義結(jié)構(gòu)體類(lèi)型,再定義結(jié)構(gòu)體變量時(shí)賦初值struct

結(jié)構(gòu)體類(lèi)型名初值表{……};struct

結(jié)構(gòu)體類(lèi)型名變量名={成員1的值,…,成員n的值};

注意:賦初值時(shí),{}中間的數(shù)據(jù)順序必須與結(jié)構(gòu)體成員的定義順序一致,否則就會(huì)出現(xiàn)混亂。struct

Student_Info

stu={"20020306","ZhangMing",'M',18,1,90};

nonamesexageclassnograde√struct

Student_Info

stu={18,"ZhangMing",'M',"20020306",1,90};

×structDate{

intyear;//年

intmonth;//月

intday;//日};struct

Stu_Info{charno[9];//學(xué)號(hào)

charname[20];//姓名

charsex;//性別

structDatebirthday;

//生日

unsignedint

classno;//班級(jí)

floatgrade;//成績(jī)};struct

Stu_Info

stu={"20020306","ZhangMing",'M',{1986,12,10},1,90};

語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C3、結(jié)構(gòu)體變量的賦值結(jié)構(gòu)體變量初始化賦值定義結(jié)構(gòu)體類(lèi)型的同時(shí),定義結(jié)構(gòu)體變量并賦初值struct

[結(jié)構(gòu)體類(lèi)型名]{初值表

……}變量名={成員1的值,成員2的值,…,成員n的值};structDate

{

intyear,month,day;}birthday={1986,12,10};

struct

{

intyear,month,day;}birthday={1986,12,10};

或struct

Student_Info{charno[9];//學(xué)號(hào)

charname[20];//姓名

charsex;//性別

unsignedintage;//年齡

unsignedint

classno;//班級(jí)

floatgrade;//成績(jī)}student={"20020306","ZhangMing",'M',18,1,90};

語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型Cstrcpy(stu1.no,stu.no);strcpy(,);stu1.sex=stu.sex;stu1.age=stu.age;stu1.classno=stu.classno;stu1.grade=stu.grade;struct

Student_Info

stu;

strcpy(stu.no,"20020306");strcpy(,"ZhangMing");stu.sex='M';stu.age=18;stu.classno=1;stu.grade=90;struct

Student_Infostu1;stu1=stu;3、結(jié)構(gòu)體變量的賦值結(jié)構(gòu)體變量在程序中賦值

如果在定義結(jié)構(gòu)體變量時(shí)并未對(duì)其賦初始值,那么在程序中要對(duì)它賦值的話(huà),就只能一個(gè)一個(gè)地對(duì)其成員逐一賦值,或者用已賦值的同類(lèi)型的結(jié)構(gòu)體變量對(duì)它賦值

逐一賦值

利用已賦值的結(jié)構(gòu)體變量賦值

memcpy

(&stu1,&stu,sizeof(struct

Student_Info));語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C【例】計(jì)算學(xué)生5門(mén)課的平均成績(jī),最高分和最低分。#include<stdio.h>structscore{floatgrade[5];floatavegrade,maxgrade,mingrade;};voidmain(){

inti;

structscorem;

printf("inputthegradeoffivecourse:\n");for(i=0;i<5;i++)//輸入5門(mén)課的成績(jī)

scanf("%f",&m.grade[i]);

m.avegrade=0;

m.maxgrade=m.grade[0];

m.mingrade=m.grade[0];for(i=0;i<5;i++)//求平均分、最高分、最低分

{

m.avegrade+=m.grade[i];

m.maxgrade=(m.grade[i]>m.maxgrade)?

m.grade[i]:m.maxgrade;

m.mingrade=(m.grade[i]<m.mingrade)?

m.grade[i]:m.mingrade;}

m.avegrade/=5;

printf("avegrade=%5.1fmaxgrade=%5.1f

mingrade=%5.1f\n",

m.avegrade,m.maxgrade,m.mingrade);}運(yùn)行結(jié)果(設(shè)5門(mén)課的成績(jī)?yōu)椋?580869068):avegrade=79.8maxgrade=90.0mingrade=68.0&m.grade[i]的運(yùn)算順序:&m.grade[i]①②③注:

.和[]同優(yōu)先級(jí),具有左結(jié)合性,高于&的優(yōu)先級(jí)語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C4、結(jié)構(gòu)體變量?jī)?nèi)存分配問(wèn)題透析

語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C結(jié)構(gòu)體變量定義以后,系統(tǒng)會(huì)為其分配一定大小的內(nèi)存空間,但分配內(nèi)存空間的大小與C語(yǔ)言程序所處的編譯環(huán)境有密切的關(guān)系。

基于TC或BC環(huán)境下的結(jié)構(gòu)體變量?jī)?nèi)存分配struct

MyStruct

{doublex;chary;

intz;}a;

內(nèi)存分配方法:在TC或BC編譯環(huán)境下,結(jié)構(gòu)體變量所占內(nèi)存空間的大小等于它所包含的每個(gè)成員所占內(nèi)存空間大小之和。sizeof(a)=sizeof(a.x)+sizeof(a.y)+sizeof(a.z)=8+1+2=11(byte)

sizeof(struct

MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=8+1+2=11(byte)語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C

基于TC或BC環(huán)境下的結(jié)構(gòu)體變量?jī)?nèi)存分配struct

MyStruct

{doublex;chary;

intz;}a;012345678910a.x(8byte)a.y(1byte)a.z(2byte)a(11byte)結(jié)構(gòu)體變量a的內(nèi)存分配示意圖:

語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C

基于VC環(huán)境下的結(jié)構(gòu)體變量?jī)?nèi)存分配在VC環(huán)境下,結(jié)構(gòu)體變量分配內(nèi)存的方式與TC或BC是不同的,其所占內(nèi)存空間的大小不一定等于結(jié)構(gòu)體變量所包含的每個(gè)成員所占內(nèi)存空間大小之和。

struct

MyStruct

{doublex;chary;

intz;}a;問(wèn):sizeof(a)=?16VC對(duì)變量存儲(chǔ)的一個(gè)特殊處理。為了提高CPU的存儲(chǔ)速度,VC對(duì)結(jié)構(gòu)體中的成員變量的起始地址做了“對(duì)齊”處理。在默認(rèn)情況下,VC規(guī)定各成員變量存放的起始地址相對(duì)于結(jié)構(gòu)的起始地址的偏移量必須為該成員變量類(lèi)型所占用的字節(jié)數(shù)的倍數(shù)。

語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C

基于VC環(huán)境下的結(jié)構(gòu)體變量?jī)?nèi)存分配類(lèi)型對(duì)齊方式(變量存放的起始地址相對(duì)于結(jié)構(gòu)的起始地址的偏移量)

char偏移量必須為sizeof(char)即1的倍數(shù)

short偏移量必須為sizeof(short)即2的倍數(shù)

int偏移量必須為sizeof(int)即4的倍數(shù)

long偏移量必須為sizeof(long)即4的倍數(shù)

float偏移量必須為sizeof(float)即4的倍數(shù)

double偏移量必須為sizeof(double)即8的倍數(shù)VC下常用數(shù)據(jù)類(lèi)型的對(duì)齊方式

在VC編譯環(huán)境下,結(jié)構(gòu)體變量?jī)?nèi)存分配方式為:

(1)結(jié)構(gòu)體變量中各成員變量在存放的時(shí)候根據(jù)在結(jié)構(gòu)體中出現(xiàn)的順序依次申請(qǐng)空間,同時(shí)按照上表的對(duì)齊方式調(diào)整位置,空缺的字節(jié)VC會(huì)自動(dòng)填充。

(2)為了確保結(jié)構(gòu)體變量所占內(nèi)存空間的大小為結(jié)構(gòu)體的字節(jié)邊界數(shù)(即該結(jié)構(gòu)體中占用最大空間的類(lèi)型所占用的字節(jié)數(shù))的倍數(shù),所以在為最后一個(gè)成員變量申請(qǐng)空間后,還會(huì)根據(jù)需要自動(dòng)填充空缺的字節(jié)。語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C

基于VC環(huán)境下的結(jié)構(gòu)體變量?jī)?nèi)存分配struct

MyStruct

{doublex;chary;

intz;}a;

(3)再接下來(lái)為第三個(gè)成員z分配空間,這時(shí)下一個(gè)可以分配的地址對(duì)于結(jié)構(gòu)體的起始地址的偏移量為9,不是sizeof(int)=4的倍數(shù),為了滿(mǎn)足對(duì)齊方式對(duì)偏移量的約束問(wèn)題,VC自動(dòng)填充3個(gè)字節(jié)(這三個(gè)字節(jié)沒(méi)有放什么東西),這時(shí)下一個(gè)可以分配的地址對(duì)于結(jié)構(gòu)的起始地址的偏移量為12,剛好是sizeof(int)=4的倍數(shù),所以把z存放在偏移量為12的地方,該成員變量占用sizeof(int)=4個(gè)字節(jié);內(nèi)存分配方法:

(1)首先為第一個(gè)成員x分配空間,其起始地址跟結(jié)構(gòu)體的起始地址相同(偏移量0,剛好為sizeof(double)的倍數(shù)),該成員變量占用sizeof(double)=8個(gè)字節(jié);

(2)接下來(lái)為第二個(gè)成員y分配空間,這時(shí)下一個(gè)可以分配的地址對(duì)于結(jié)構(gòu)的起始地址的偏移量為8,是sizeof(char)的倍數(shù),所以把y存放在偏移量為8的地方滿(mǎn)足對(duì)齊方式,該成員變量占用sizeof(char)=1個(gè)字節(jié);語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C

基于VC環(huán)境下的結(jié)構(gòu)體變量?jī)?nèi)存分配struct

MyStruct

{doublex;chary;

intz;}a;這時(shí)整個(gè)結(jié)構(gòu)的成員變量已經(jīng)都分配了空間,總的占用的空間大小為:8+1+3+4=16,剛好為結(jié)構(gòu)的字節(jié)邊界數(shù)(即結(jié)構(gòu)中占用最大空間的類(lèi)型所占用的字節(jié)數(shù)sizeof(double)=8)的倍數(shù),所以沒(méi)有空缺的字節(jié)需要填充。整個(gè)結(jié)構(gòu)體變量占用內(nèi)存空間的大小為:sizeof(a)=8+1+3+4=16,其中有3個(gè)字節(jié)是VC自動(dòng)填充的,沒(méi)有放任何有意義的東西。0123456789101112131415a.x(8byte)a.y(1byte)自動(dòng)填充(3byte)a.z(4byte)a(16byte)sizeof(double)=8的倍數(shù)sizeof(char)=1的倍數(shù)sizeof(int)=4的倍數(shù)語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C

基于VC環(huán)境下的結(jié)構(gòu)體變量?jī)?nèi)存分配結(jié)構(gòu)體變量定義內(nèi)存分配說(shuō)明struct

MyStruct{chary;偏移量為0,滿(mǎn)足對(duì)齊方式,y占用1個(gè)字節(jié);doublex;下一個(gè)可用的地址的偏移量為1,不是sizeof(double)=8的倍數(shù),需要補(bǔ)足7個(gè)字節(jié)才能使偏移量變?yōu)?(滿(mǎn)足對(duì)齊方式),因此VC自動(dòng)填充7個(gè)字節(jié),x存放在偏移量為8的地址上,它占用8個(gè)字節(jié)intz;下一個(gè)可用的地址的偏移量為16,是sizeof(int)=4的倍數(shù),滿(mǎn)足int的對(duì)齊方式,所以不需要VC自動(dòng)填充,z存放在偏移量為16的地址上,它占用4個(gè)字節(jié)}b;空間總的大小為1+7+8+4=20,不是結(jié)構(gòu)體的字節(jié)邊界數(shù)(即結(jié)構(gòu)體中占用最大空間的類(lèi)型所占用的字節(jié)數(shù)sizeof(double)=8)的倍數(shù),所以需要填充4個(gè)字節(jié),以滿(mǎn)足結(jié)構(gòu)體變量b所占內(nèi)存空間的大小為sizeof(double)=8的倍數(shù)。變量b所占內(nèi)存空間總的大小為:sizeof(b)=1+7+8+4+4=24(字節(jié))

語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型Cstruct

MyStruct

{chary;doublex;

intz;}b;

01234567891011121314151617181920212223b.x(8byte)自動(dòng)填充(7byte)b.y(1byte)b.z(4byte)自動(dòng)填充(4byte)b(24byte)sizeof(char)=1的倍數(shù)sizeof(double)=8的倍數(shù)sizeof(int)=4的倍數(shù)使總的字節(jié)數(shù)為sizeof(double)=8的倍數(shù)5、簡(jiǎn)化結(jié)構(gòu)體類(lèi)型名

利用typedef語(yǔ)句為結(jié)構(gòu)體類(lèi)型起別名,這樣可使定義結(jié)構(gòu)體類(lèi)型的變量顯得更為簡(jiǎn)潔,同時(shí)也增加程序的易讀性。typedef語(yǔ)句的格式為:typedef

類(lèi)型名類(lèi)型名的別名;必須是已經(jīng)定義的數(shù)據(jù)類(lèi)型名或C語(yǔ)言提供的基本類(lèi)型名

必須是合法的標(biāo)識(shí)符,通常用大寫(xiě)字母來(lái)表示必須以分號(hào)結(jié)尾

typedef

intINTEGER;

//INTEGER是別名typedefchar*STRING

//STRING是別名struct

teacher_info{charname[20],charsex,unit[30];unsignedintage,workyears;floatsalary;};typedef

struct

teacher_infoTEACHER;

//TEACHER是別名INTEGERa;//相當(dāng)于inta;STRINGstr;//相當(dāng)于char*str;TEACHERt;//相當(dāng)于struct

teacher_infot;typedefcharARRAY[81];

//ARRAY是別名ARRAYstr;//相當(dāng)于charstr[81];語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C6、結(jié)構(gòu)體數(shù)組

結(jié)構(gòu)體數(shù)組的每一個(gè)元素都是具有相同結(jié)構(gòu)體類(lèi)型的下標(biāo)結(jié)構(gòu)變量。結(jié)構(gòu)體數(shù)組的定義三種形式:agenonamesexclassnogradeagenonamesexclassnograde…stu[0]stu[9]……形式一:struct

Student_Info{charno[9],name[20],sex;unsignedintage,classno;floatgrade;};struct

Student_Infostu[10];形式二:struct

Student_Info{charno[9],name[20],sex;unsignedintage,classno;floatgrade;}stu[10];形式三:struct{charno[9],name[20],sex;unsignedintage,classno;floatgrade;}stu[10];語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C結(jié)構(gòu)體數(shù)組與二維表的對(duì)應(yīng)關(guān)系

結(jié)構(gòu)體數(shù)組就相當(dāng)于一張二維表,一個(gè)表的框架對(duì)應(yīng)的就是某種結(jié)構(gòu)體類(lèi)型,表中的每一列對(duì)應(yīng)該結(jié)構(gòu)體的成員,表中每一行信息對(duì)應(yīng)該結(jié)構(gòu)體數(shù)組元素各成員的具體值,表中的行數(shù)對(duì)應(yīng)結(jié)構(gòu)體數(shù)組的大小。

nonamesexageclassnograde………………………………結(jié)構(gòu)體類(lèi)型Student_Infostu[0]stu[1]stu[9]……struct

Student_Info{charno[9];charname[20];charsex;unsignedintage;unsignedint

classno;floatgrade;}stu[10];語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C結(jié)構(gòu)體數(shù)組的初始化初始化的格式為:struct

結(jié)構(gòu)體類(lèi)型名{……};struct

結(jié)構(gòu)體類(lèi)型名結(jié)構(gòu)體數(shù)組[size]={{初值表1},…,{初值表n}};struct

[結(jié)構(gòu)體類(lèi)型名]{……}結(jié)構(gòu)體數(shù)組[size]={{初值表1},{初值表2},…,{初值表n}};或struct

Student_Infostu[3]={{"20020306","ZhangMing",'M',18,1,90},{"20020307","WangHai",'M',17,1,85},{"20020308","LiHong",'F',18,2,95}};例:分行初始化struct

Student_Info

stu[]={{"20020306","ZhangMing",'M',18,1,90},{"20020307","WangHai",'M',17,1,85},{"20020308","LiHong",'F',18,2,95}};例:分行初始化全部初始化時(shí)維數(shù)可省struct

Student_Infostu[3]={"20020306","ZhangMing",'M',18,1,90,"20020307","WangHai",'M',17,1,85,"20020308","LiHong",'F',18,2,95};例:順序初始化例:struct

Man_Info

//Man_Info也可省略{charname[20];

structDate{intyear,intmonth,intday}birthday;}man[]={{"ZhangXiang",{1986,10,29}},{"WangFei",{1987,12,10}}};語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C結(jié)構(gòu)體數(shù)組的引用引用格式為:結(jié)構(gòu)體數(shù)組名[下標(biāo)].成員名;struct

Student_Info{charno[9];charname[20];charsex;unsignedintage;unsignedint

classno;floatgrade;}stu[10];strcpy(stu[0].name,"WangFei");

stu[1].grade++;printf("%s",stu[0].name);語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C【例】統(tǒng)計(jì)侯選人選票。#include<stdio.h>#include<string.h>structperson{charname[20];//候選人姓名

intcount;//得票數(shù)}leader[3]={"Li",0,"Zhang",0,"Wang",0};voidmain(){

inti,j;charleader_name[20];while(1)//統(tǒng)計(jì)候選人得票數(shù)

{

scanf("%s",leader_name);//輸入候選人姓名

if(strcmp(leader_name,"0")==0)//輸入為"0"結(jié)束

break;for(j=0;j<3;j++)//比較是否為合法候選人

if(strcmp(leader_name,leader[j].name)==0)//合法

leader[j].count++;//得票數(shù)加1}for(i=0;i<3;i++)//顯示后選人得票數(shù)

printf("%5s:%d\n",leader[i].name,leader[i].count);}語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C11.3線(xiàn)性鏈表1、線(xiàn)性鏈表概述及其結(jié)構(gòu)

線(xiàn)性表:當(dāng)一組數(shù)據(jù)元素形成了“前后”關(guān)系時(shí),我們稱(chēng)之為線(xiàn)性表

線(xiàn)性表在內(nèi)存中的兩種形式順序表:以數(shù)組的形式存放,元素在內(nèi)存中是連續(xù)存放的線(xiàn)性鏈表:數(shù)據(jù)元素在內(nèi)存中不需要連續(xù)存放,而是通過(guò)指針將各數(shù)據(jù)單元鏈接起來(lái),就象一條“鏈子”一樣將數(shù)據(jù)單元前后元素鏈接起來(lái)

特點(diǎn):插入或刪除一個(gè)數(shù)據(jù)元素時(shí),需要移動(dòng)其它數(shù)據(jù)元素

特點(diǎn):插入或刪除一個(gè)數(shù)據(jù)元素時(shí),不需要移動(dòng)其它數(shù)據(jù)元素

節(jié)點(diǎn)實(shí)際數(shù)據(jù)鏈表頭節(jié)點(diǎn)…h(huán)eadtail數(shù)據(jù)1數(shù)據(jù)2數(shù)據(jù)n^表示NULL數(shù)據(jù)域指針域語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C線(xiàn)性鏈表中的節(jié)點(diǎn)可以用一個(gè)結(jié)構(gòu)體類(lèi)型來(lái)定義,其形式為:

struct

節(jié)點(diǎn)結(jié)構(gòu)體類(lèi)型名{

數(shù)據(jù)成員定義;

struct

節(jié)點(diǎn)結(jié)構(gòu)體類(lèi)型名

*指針變量名;};例:struct

Grade_Info{

intscore;

struct

Grade_Info*next;};typedef

struct

Grade_Info

NODE;

語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C2、線(xiàn)性鏈表的基本操作基本操作有:創(chuàng)建、插入、刪除、輸出和銷(xiāo)毀等。鏈表的創(chuàng)建操作

含義:從無(wú)到有地建立起一個(gè)鏈表,即往空鏈表中依次插入若干結(jié)點(diǎn),并保持結(jié)點(diǎn)之間的前驅(qū)和后繼關(guān)系。

基本思想:首先創(chuàng)建一個(gè)頭節(jié)點(diǎn),讓頭指針head和尾指針tail都指向該節(jié)點(diǎn),并設(shè)置該節(jié)點(diǎn)的指針域?yàn)镹ULL(鏈尾標(biāo)志);然后為實(shí)際數(shù)據(jù)創(chuàng)建一個(gè)節(jié)點(diǎn),用指針pnew指向它,并將實(shí)際數(shù)據(jù)放在該節(jié)點(diǎn)的數(shù)據(jù)域,其指針域置為NULL;最后將該節(jié)點(diǎn)插入到tail所指向節(jié)點(diǎn)的后面,同時(shí)使tail指向pnew所指向的節(jié)點(diǎn)。語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C【例】鏈表創(chuàng)建操作函數(shù)Create_LinkList。head∧tailNODE*Create_LinkList()//創(chuàng)建鏈表{NODE*head,*tail,*pnew;

int

scor;

head=(NODE*)malloc(sizeof(NODE));

//創(chuàng)建頭節(jié)點(diǎn)

if(head==NULL)//創(chuàng)建失敗,則返回

{

printf("noenoughmemory!\n");return(NULL);}head->next=NULL;//頭節(jié)點(diǎn)的指針域置NULLtail=head;//開(kāi)始時(shí)尾指針指向頭節(jié)點(diǎn)語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C

pnew->score=score;

pnew->next=NULL;

tail->next=pnew;

tail=pnew;}return(head);}【例】鏈表創(chuàng)建操作函數(shù)Create_LinkList。head∧tailinputthescoreofstudents:70↙pnew70∧tail65↙pnew65∧tail78↙pnew78∧tail90↙pnewtail90∧95↙pnewtail95∧-1↙

printf("inputthescoreofstudents:\n");while(1)//創(chuàng)建學(xué)生成績(jī)線(xiàn)性鏈表

{

scanf("%d",&score);//輸入成績(jī)

if(score<0)//成績(jī)?yōu)樨?fù),循環(huán)退出

break;

//創(chuàng)建一新節(jié)點(diǎn)

pnew=(NODE*)malloc(sizeof(NODE));

if(pnew==NULL)//創(chuàng)建新節(jié)點(diǎn)失敗,則返回

{

printf("noenoughmemory!\n");return(NULL);}語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C2、線(xiàn)性鏈表的基本操作鏈表的插入操作

含義:在第i個(gè)結(jié)點(diǎn)Ni與第i+1節(jié)點(diǎn)Ni+1之間插入一個(gè)新的結(jié)點(diǎn)N,使線(xiàn)性表的長(zhǎng)度增1,且Ni與Ni+1的邏輯關(guān)系發(fā)生如下變化:插入前,Ni是Ni+1的前驅(qū),Ni+1是Ni的后繼;插入后,新插入的結(jié)點(diǎn)N成為Ni的后繼、Ni+1的前驅(qū)

基本思想:通過(guò)單鏈表的頭指針head,首先找到鏈表的第一個(gè)結(jié)點(diǎn);然后順著結(jié)點(diǎn)的指針域找到第i個(gè)結(jié)點(diǎn),最后將pnew指向的新結(jié)點(diǎn)插入到第i個(gè)結(jié)點(diǎn)之后。插入時(shí)首先將新節(jié)點(diǎn)的指針域指向第i個(gè)結(jié)點(diǎn)的后繼節(jié)點(diǎn),然后再將第i個(gè)結(jié)點(diǎn)的指針域指向新節(jié)點(diǎn)。注意順序不可顛倒。當(dāng)i=0時(shí),表示頭節(jié)點(diǎn)。

語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C【例】鏈表插入操作函數(shù)Insert_LinkList

。voidInsert_LinkList(NODE*head,NODE*pnew,inti){NODE*p;

intj;p=head;for(j=0;j<i&&p!=NULL;j++)//將p指向要插入的第i個(gè)節(jié)點(diǎn)

p=p->next;if(p==NULL)//表明鏈表中第i個(gè)節(jié)點(diǎn)不存在

{

printf("the%dnodenotfoundt!\n",i);return;}

pnew->next=p->next;

//將插入節(jié)點(diǎn)的指針域指向第i個(gè)節(jié)點(diǎn)的后繼節(jié)點(diǎn)

p->next=pnew;

//將第i個(gè)節(jié)點(diǎn)的指針域指向插入節(jié)點(diǎn)}

head70657890∧0123465pnew假設(shè)i=2ppp語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C2、線(xiàn)性鏈表的基本操作鏈表的刪除操作

含義:刪除鏈表中的第i個(gè)結(jié)點(diǎn)Ni,使線(xiàn)性表的長(zhǎng)度減1。刪除前,節(jié)點(diǎn)Ni-1是Ni的前驅(qū),Ni+1是Ni的后繼;刪除后,結(jié)點(diǎn)Ni+1成為Ni-1的后繼。

基本思想:通過(guò)單鏈表的頭指針head,首先找到鏈表中指向第i個(gè)結(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)的指針p和指向第i個(gè)節(jié)點(diǎn)的指針q;然后刪除第i個(gè)結(jié)點(diǎn)。刪除時(shí)只需執(zhí)行p->next=q->next即可,當(dāng)然不要忘了釋放節(jié)點(diǎn)i的內(nèi)存單元。注意當(dāng)i=0時(shí),表示頭節(jié)點(diǎn),是不可刪除的。

語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C【例】鏈表刪除操作函數(shù)Delete_LinkList

。voidDelete_LinkList(NODE*head,inti){NODE*p,*q;

intj;if(i==0)return;//刪除的是頭指針,則返回

p=head;//將p指向要?jiǎng)h除的第i個(gè)節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)

for(j=1;j<i&&p->next!=NULL;j++)p=p->next;

if(p->next==NULL)//表明鏈表中第i個(gè)節(jié)點(diǎn)不存在

{

printf("the%dnodenotfoundt!\n",i);return;}head70657890∧01234假設(shè)i=2p

q=p->next;

//q指向待刪除的節(jié)點(diǎn)ip->next=q->next;

//刪除節(jié)點(diǎn)i

free(q);

//釋放節(jié)點(diǎn)i的內(nèi)存單元}

pq語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C2、線(xiàn)性鏈表的基本操作鏈表的輸出操作

含義:將鏈表中節(jié)點(diǎn)的數(shù)據(jù)域的值顯示出來(lái)。如果在輸出過(guò)程中,對(duì)數(shù)據(jù)進(jìn)行相應(yīng)的比較,則可實(shí)現(xiàn)對(duì)鏈表的檢索操作。

基本思想:通過(guò)單鏈表的頭指針head,使指針p指向?qū)嶋H數(shù)據(jù)鏈表的第一個(gè)節(jié)點(diǎn),輸出其數(shù)據(jù)值,接著p又指向下一個(gè)節(jié)點(diǎn),輸出其數(shù)據(jù)值,如此進(jìn)行下去,直到尾節(jié)點(diǎn)的數(shù)據(jù)項(xiàng)輸出完為止,即p為NULL為止。

voidDisplay_LinkList(NODE*head){NODE*p;for(p=head->next;p!=NULL;p=p->next)

printf("%d",p->score);

printf("\n");}【例】鏈表輸出操作函數(shù)Display_LinkList

。語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C2、線(xiàn)性鏈表的基本操作鏈表的銷(xiāo)毀操作

含義:將創(chuàng)建的鏈表從內(nèi)存中釋放掉,達(dá)到銷(xiāo)毀的目的

基本思想:每次刪除頭節(jié)點(diǎn)的后繼節(jié)點(diǎn),最后刪除頭節(jié)點(diǎn)。注意,不要以為只要?jiǎng)h除了頭節(jié)點(diǎn)就可以刪除整個(gè)鏈表,要知道鏈表是一個(gè)節(jié)點(diǎn)一個(gè)節(jié)點(diǎn)建立起來(lái)的,所以銷(xiāo)毀它也必須一個(gè)一個(gè)節(jié)點(diǎn)的刪除才行。語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型CvoidFree_LinkList(NODE*head)

{NODE*p,*q;p=head;while(p->next!=NULL){q=p->next;p->next=q->next;free(q);}free(head);}【例】鏈表銷(xiāo)毀操作函數(shù)Free_LinkList

。head70657890∧01234pqqqq∧語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C3、線(xiàn)性鏈表應(yīng)用舉例【例】建立一個(gè)學(xué)生成績(jī)的線(xiàn)性鏈表,然后對(duì)其進(jìn)行插入、刪除、顯示,最后銷(xiāo)毀該鏈表。#include<stdio.h>#include<stdlib.h>struct

Grade_Info{

intscore;

struct

Grade_Info*next;}typedef

struct

Grade_InfoNODE;NODE*Create_LinkList();voidInsert_LinkList(NODE*head,NODE*pnew,inti);voidDelete_LinkList(NODE*head,inti);voidDisplay_LinkList(NODE*head);voidFree_LinkList(NODE*head);voidmain(){NODE*head,*pnew;head=Create_LinkList();//創(chuàng)建鏈表

if(head==NULL)//創(chuàng)建失敗

return;

printf("aftercreate:");

Display_LinkList(head);//輸出鏈表中的值

//新建一插入的節(jié)點(diǎn)

pnew=(NODE*)malloc(sizeof(NODE));if(pnew==NULL)//創(chuàng)建失敗,則返回

{

printf("noenoughmemory!\n");return;}

pnew->score=88;//將新節(jié)點(diǎn)插入節(jié)點(diǎn)3的后面

Insert_LinkList(head,pnew,3);

printf("afterinsert:");

Display_LinkList(head);//輸出鏈表中的值

Delete_LinkList(head,3);//刪除鏈表中節(jié)點(diǎn)3

printf("afterdelete:");

Display_LinkList(head);//輸出鏈表中的值

Free_LinkList(head);//銷(xiāo)毀鏈表}運(yùn)行結(jié)果(假設(shè)輸入為:706578909585-1):aftercreate:706578909585afterinsert:70657888909585afterdelete:706588909585語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C11.4聯(lián)合體構(gòu)造數(shù)據(jù)類(lèi)型,也叫共用體

用途:使幾個(gè)不同類(lèi)型的變量共占一段內(nèi)存(相互覆蓋)1、聯(lián)合體類(lèi)型的定義

union[聯(lián)合體類(lèi)型名]{

數(shù)據(jù)類(lèi)型名1成員名1;數(shù)據(jù)類(lèi)型名2成員名2;

……

數(shù)據(jù)類(lèi)型名n成員名n;};類(lèi)型定義不分配內(nèi)存chif2000200120022003共占4字節(jié)sizeof(union

UData)=sizeof(f)

聯(lián)合體的大小是成員中占內(nèi)存最大的成員的大小

unionUData{shorti;charch;floatf;};chif20002001200220032004200520062007共占7字節(jié)struct

SData{shorti;charch;floatf;};語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C2、聯(lián)合體變量的定義和引用聯(lián)合體變量的定義形式一:uniondata{shorti;charch;floatf;}a,b;形式二:uniondata{shorti;charch;floatf;};uniondataa,b,*p,d[3];形式三:union{shorti;charch;floatf;}a,b,c;fchifchiab共用體變量任何時(shí)刻只有一個(gè)成員存在共用體變量定義分配內(nèi)存,長(zhǎng)度=最長(zhǎng)成員所占字節(jié)數(shù)語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C聯(lián)合體變量的引用聯(lián)合體變量名.成員名聯(lián)合體指針名->成員名

(*聯(lián)合體指針名).成員名

uniondata{

inti;charch;floatf;};uniondataa,b,c,*p,d[3];a.ia.cha.fp->ip->chp->f(*p).i(*p).ch(*p).fd[0].id[0].chd[0].f語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C3、聯(lián)合體變量的賦值聯(lián)合體變量的初始化賦值定義聯(lián)合體變量時(shí)可以對(duì)變量賦初值,但只能對(duì)變量的第一個(gè)成員賦初值,不可象結(jié)構(gòu)體變量那樣對(duì)所有的成員賦初值。unionUData{shorti;charch;floatf;};unionUDatadata={10};//10賦給成員iunionUDatadata={'A'};//'A'賦給成員i,即i的值為65('A'的ASCII碼)unionUDatadata={10,'A',12.5};//錯(cuò)誤,{}中只能有一個(gè)值unionUDatadata=10;//錯(cuò)誤,初值必須用{}括起來(lái)語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C3、聯(lián)合體變量的賦值聯(lián)合體變量在程序中賦值

定義了聯(lián)合體變量以后,如果要對(duì)其賦值,則只能通過(guò)對(duì)其成員賦值,不可對(duì)其整體賦值。

具有相同聯(lián)合體類(lèi)型的變量之間也可以相互賦值。

unionUData{shorti;charch;floatf;};unionUDatadata,*p,d[10];data={10};//錯(cuò)誤data=10;//錯(cuò)誤data.i=10;//正確,將10賦給data的成員ip=&data;//p指向datap->f=12.5;//正確,將12.5賦給data的成員fd[0].ch='A'//正確,將'A'賦給d[0]的成員chunionUDatadata1={10},data2;data2=data1;//正確語(yǔ)言程序設(shè)計(jì)教程第二版第十一章復(fù)雜數(shù)據(jù)類(lèi)型C幾點(diǎn)說(shuō)明:

由于聯(lián)合體變量的各成員共享同一地址的內(nèi)存單元,所以在對(duì)其成員賦值的某一時(shí)刻,存放的和起作用的將是最后一次存入的成員值對(duì)聯(lián)合體變量的某個(gè)成員賦值時(shí),也改變了其它成員的值,因?yàn)樗鼈児蚕硪粋€(gè)內(nèi)存地址。

由于聯(lián)合體變量所有成員共享同一內(nèi)存空間,因此聯(lián)合體變量與其各成員的地址相同。

unionUDatadata;data.i=10;data.ch='A';data.f=12.5;則data.f的值才是有效的成員的值。unionUDatadata;data.i=10;data.ch=

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論