結(jié)構(gòu)與聯(lián)合學習課件_第1頁
結(jié)構(gòu)與聯(lián)合學習課件_第2頁
結(jié)構(gòu)與聯(lián)合學習課件_第3頁
結(jié)構(gòu)與聯(lián)合學習課件_第4頁
結(jié)構(gòu)與聯(lián)合學習課件_第5頁
已閱讀5頁,還剩68頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

8結(jié)構(gòu)與聯(lián)合主要內(nèi)容:結(jié)構(gòu)類型與結(jié)構(gòu)變量結(jié)構(gòu)指針結(jié)構(gòu)數(shù)組結(jié)構(gòu)與函數(shù)聯(lián)合與位段主要內(nèi)容:結(jié)構(gòu)類型與結(jié)構(gòu)變量結(jié)構(gòu)指針結(jié)構(gòu)數(shù)組結(jié)構(gòu)與函數(shù)聯(lián)合與位段1-1結(jié)構(gòu)類型利用變量只能處理單個數(shù)據(jù)利用數(shù)組可以處理多個同類型的數(shù)據(jù)–通過結(jié)構(gòu)類型將不同類型數(shù)據(jù)組合成一個有機的整體10001

ZhangsanBeijingIDnameintchar

[

]M

18char

intchar

[

]87.5sex

age

addr

scorefloat1-1結(jié)構(gòu)類型結(jié)構(gòu)類型是一種將不同數(shù)據(jù)類型的變量說明(稱為結(jié)構(gòu)類型的成員)組織起來所形成的一種新的構(gòu)造類型struct

student{int

num;char

name

[20];char

sex;int

age;

char

addr[30];float

score;};#include

<stdio.h>struct

student{3.

int

num;charname

[20];4.

char

sex;intage;5.

char

addr[30];floatscore;6.

};7.

void

main(void){8.

int

i;struct

student

cs[5]

=

{{1,

"Zhao",

"F",

20,

"D1-401",

86.5},{2,

"Qian",

"M",

19,

"D8-201",

79},{3,

"Sun",

"M",

19,

"D8-201",

98},{4,

"Li",

"F",

19,

"D1-401",

89},{5,

"Zhou",

"M",20,

"D8-201",

50}};for(i

=

0;

i

<

5;

i++)9.10.11.12.13.14.15.printf("%d\t%s\t%c\t%d\t%s\t%f\n",

cs[i].num,

cs[i].name,

cs[i].sex,cs[i].addr,

cs[i].score);16.

}1-1結(jié)構(gòu)類型結(jié)構(gòu)類型的使用包含兩個階段:

設(shè)計結(jié)構(gòu)類型:在程序設(shè)計中,要先確定結(jié)構(gòu)類型的所有成員通過定義結(jié)構(gòu)類型將這些成員組織起來,形成新的數(shù)據(jù)類型使用結(jié)構(gòu)類型:通過結(jié)構(gòu)類型來聲明對應的結(jié)構(gòu)變量、結(jié)構(gòu)指針、或結(jié)構(gòu)數(shù)組對結(jié)構(gòu)變量、結(jié)構(gòu)指針、或結(jié)構(gòu)數(shù)組中成員的操作最終完成所需要解決的計算任務1-1結(jié)構(gòu)類型結(jié)構(gòu)類型的聲明:struct結(jié)構(gòu)類型名{成員聲明表};

成員列表包含結(jié)構(gòu)體的所有成員的聲明成員聲明形式:類型名成員名;類型名可以是除本結(jié)構(gòu)類型以外的其他任何類型struct

student{int

num;char

name

[20];char

sex;int

age;

char

addr[30];float

score;};1-1結(jié)構(gòu)類型同一結(jié)構(gòu)內(nèi)的成員不能同名,但成員可以與結(jié)構(gòu)外部的變量同名,也可以與其他結(jié)構(gòu)的成員同名char

name[20];struct

student{int

num;char

name

[20];char

addr[30];};struct

teacher{int

num;char

name

[20];char

addr[30];};1-1結(jié)構(gòu)類型注意:

結(jié)構(gòu)類型聲明用于創(chuàng)建用戶自定義數(shù)據(jù)類型,不進行存儲分配sizeof(struct

student)的值?1-2結(jié)構(gòu)類型的命名用typedef可以為一個已知的結(jié)構(gòu)類型命名typedef

struct

point

{int

x;int

y;}

point;將結(jié)構(gòu)類型struct

point命名為pointpoint

u,v;與struct

point

u,v;等價1-2結(jié)構(gòu)類型的命名用typedef也可以為一個匿名結(jié)構(gòu)類型進行命名typedef

struct

{int

x;int

y;}

point;將匿名結(jié)構(gòu)類型命名為pointpoint

u,

v;1-3結(jié)構(gòu)類型的嵌套結(jié)構(gòu)成員也可以是其他結(jié)構(gòu),形成結(jié)構(gòu)的嵌套struct

student{int

num;char

name

[20];struct

date{int

year;int

month;int

day;}birthday;char

addr[30];};struct

date{int

year;int

month;int

day;}struct

student{int

num;char

name

[20];struct

date

birthday;char

addr[30];};1-4結(jié)構(gòu)變量的聲明數(shù)據(jù)類型為結(jié)構(gòu)類型的變量簡稱為結(jié)構(gòu)變量或結(jié)構(gòu)結(jié)構(gòu)變量的聲明有兩種方式:先聲明結(jié)構(gòu)類型,再聲明結(jié)構(gòu)變量在聲明結(jié)構(gòu)類型的同時聲明結(jié)構(gòu)變量1-4結(jié)構(gòu)變量的聲明(1)結(jié)構(gòu)類型和結(jié)構(gòu)變量分別聲明struct

student{int

num;char

name

[20];struct

date{int

year;int

month;int

day;}birthday;char

addr[30];};struct

student

ZhangSan;static

struct

student

a1,

a2,

a3;struct

student

a[100];struct

student

*pstu;一般形式:存儲類型

struct結(jié)構(gòu)類型名結(jié)構(gòu)變量列表;1-4結(jié)構(gòu)變量的聲明(2)結(jié)構(gòu)類型和結(jié)構(gòu)變量同時聲明struct

student{int

num;char

name

[20];struct

date{int

year;int

month;int

day;}birthday;char

addr[30];}ZhangSan,

a1,

a[100],

*psth;如果結(jié)構(gòu)類型只使用一次,則結(jié)構(gòu)類型名student可以省略,成為匿名結(jié)構(gòu)類型1-4結(jié)構(gòu)變量的聲明(2)結(jié)構(gòu)類型和結(jié)構(gòu)變量同時聲明static

struct

point

{int

x;int

y;}

p1,

p2;在聲明結(jié)構(gòu)類型structpoint的同時,聲明了structpoint類型的靜態(tài)結(jié)構(gòu)變量p1和p21-5結(jié)構(gòu)變量的初始化聲明結(jié)構(gòu)變量同時可以對其進行初始化–初始化所用的初值由初值表提供struct student

{charcharname[10];sex;short

age;int

score[2];}

student1={"zhang

san","m",18,{80,90}};struct student

student2

=

{""Li

Si",

"m",18,

{85,91}};注意:初值表中各初始化表達式的類型應與定義成員的類型一一對應1-6結(jié)構(gòu)變量的存儲空間結(jié)構(gòu)成員在內(nèi)存中連續(xù)存放,成員的存儲分配按照從上向下、同一聲明中從左向右的順序進行,每個成員所占存儲空間的大小由其類型確定struct

student

ZhangSan;addr30bnum2name20year2irthdaymonth26day21-6結(jié)構(gòu)變量的存儲空間結(jié)構(gòu)變量的大小是指一個結(jié)構(gòu)變量占用的存儲空間的字節(jié)數(shù)–一般等于一個結(jié)構(gòu)變量所有成員的存儲字節(jié)數(shù)的總和當需要使用結(jié)構(gòu)的大小時,通常應使用sizeof運算符來計算課后學習:存儲邊界對齊相關(guān)知識1-6結(jié)構(gòu)變量的存儲空間sizeof運算符是一個單目運算符,用于計算指定類型數(shù)據(jù)的大小,即所需要占據(jù)存儲的字節(jié)數(shù)由sizeof運算符構(gòu)成的表達式有兩種形式。即: sizeof

(表達式)表達式可以是任意表達式或者:sizeof(數(shù)據(jù)類型名)數(shù)據(jù)類型是除void外的任何數(shù)據(jù)類型的類型名1-6結(jié)構(gòu)變量的存儲空間float

x;

const

int

YES=1;

struct

student

st,

sts[30];sizeof(char)

1,sizeof(short)

2,sizeof(float)

4,sizeof(x)

4,sizeof(YES)

2,sizeof(struct

student)

21或22,sizeof(st)sizeof(sts)21或22,(21或22)*30struct

student{long

num;char

name

[10];char

sex;int

age;float

score;};思考:結(jié)構(gòu)類型包含指針成員時的情況1-7結(jié)構(gòu)的引用包括對結(jié)構(gòu)變量的引用和對結(jié)構(gòu)變量中成員的引用兩個方面

對結(jié)構(gòu)變量的引用包括結(jié)構(gòu)變量的賦值操作、取地址操作和間訪操作,以及結(jié)構(gòu)變量作為函數(shù)的參數(shù)及返回值

對結(jié)構(gòu)變量中成員的引用則需要通過成員選擇運算符“.”來實現(xiàn)1-7-1結(jié)構(gòu)變量的引用同類型的結(jié)構(gòu)變量可以相互賦值–賦值操作將右端結(jié)構(gòu)變量中各個成員的值一一賦給左端結(jié)構(gòu)變量的各個成員例:struct

student

st1

=

{"zhang

san",

"m",

18,

{80,

90}};

struct

student

st2

=

{"Li

Si",

"m",

18,

{85,

91}},

st3;

st3

=

st1;

st1

=

st2;

st2

=

st3;st1={"zhang

san","m",18,{80,90}};是否合法?課后學習:淺拷貝、深拷貝1-7-1結(jié)構(gòu)變量的引用可以通過

&

獲取結(jié)構(gòu)變量的地址,如:struct

student

st1,

st2,

*p

=

&st1;通過

*

對指針所指結(jié)構(gòu)變量進行間訪操作,如:*p

=

st2;1-7-2結(jié)構(gòu)成員的引用C提供成員選擇運算符“.”支持對成員的訪問和操作成員選擇表達式的一般形式是:結(jié)構(gòu)變量名.成員名其中:

“.”是一個雙目操作符,其左操作數(shù)是結(jié)構(gòu)變量,右操作數(shù)是結(jié)構(gòu)變量的成員

“.”操作符具有最高優(yōu)先級,由它構(gòu)成的成員選擇表達式在任何地方都是一個整體,表示對結(jié)構(gòu)變量中成員的訪問1-7-2結(jié)構(gòu)成員的引用struct

student

st1;strcpy(,"zhang");

scanf("%s",

);s1.sex="m";s1.age=18;s1.score[0]=80;s1.score[1]=87;scanf("%c",

&s1.sex);scanf("%d",

&s1.age);scanf("%d",

&s1.score[0]);scanf("%d",

&s1.score[1]);1-7-3嵌套結(jié)構(gòu)的引用嵌套結(jié)構(gòu)中成員的成員同樣采用“.”操作符訪問“.”操作符的使用個數(shù)與嵌套結(jié)構(gòu)的層數(shù)相等

“.”操作符的結(jié)合性是從左至右struct

date{int

year,

month,

day;}struct

student{int

num;char

name

[20];struct

date

birthday;char

addr[30];};struct student

st1,

st2;st1.birthday.day

=

16;st1.birthday.year

=

1980;(st1.birthday).day與st1.(birthday.day)有什么區(qū)別?例根據(jù)平面上點的結(jié)構(gòu)類型構(gòu)造平面上線段的嵌套結(jié)構(gòu)類型,說明對嵌套結(jié)構(gòu)變量中結(jié)構(gòu)成員的成員的引用,并求線段的長度4./*平面上點的結(jié)構(gòu)類型*//*

x,y是點的坐標*/7.8.9.#include

"stdio.h"#include

"math.h"struct

point{int

x,

y;5.

};6.

struct

line{char

name[6];struct

point

start;struct

point

end;/*平面上線段的嵌套結(jié)構(gòu)類型*//*線段名稱*//*線段的起點*//*線段的終點*/10.

};11.11.11.

void

main(void){struct

line

a

=

{"abc",

{1,

1},

{10,

10}};double

dx2,

dy2,

length;11.11.11.11.11.printf("line

name

is

%s\n",

);printf("starting

point:(%d,

%d)\n",

a.start.x,

a.start.y);printf("endpoint:(%d,

%d)\n",

a.end.x,

a.end.y);scanf("%s",

);scanf("%d%

d%",

&a.start.x,

&a.start.y);11.11.11.11.11.a.end.x

=

100;

a.end.y

=

100;dx2

=

(a.end.x

-

a.start.x)

*

(a.end.x

-

a.start.x);dy2

=

(a.end.y

-

a.start.y)

*

(a.end.y

-

a.start.y);length

=

sqrt(dx2

+

dy2);printf("the

tength

is

%lf\n",

length);11.

}1-7-3嵌套結(jié)構(gòu)的引用int

x,

y;}point;typedef

struct{point

start;point

end;}line;通過結(jié)構(gòu)嵌套,利用已有結(jié)構(gòu)定義新的結(jié)構(gòu),實現(xiàn)代碼復用typedef

struct{typedef

struct{int

r;point

center;}circle;typedef

struct{point

a;line

l;}plain;plain

p

=

{{1,

1},

{{5,

5},

{10,

15}}};p.a.x

=

10;

p.l.start.x

=

100;主要內(nèi)容:結(jié)構(gòu)類型與結(jié)構(gòu)變量結(jié)構(gòu)指針結(jié)構(gòu)數(shù)組結(jié)構(gòu)與函數(shù)聯(lián)合與位段2結(jié)構(gòu)指針struct

student

b,

*

pb

=

&b;pb

=

&a;結(jié)構(gòu)指針是指以結(jié)構(gòu)類型為基類型的指針,即結(jié)構(gòu)型指針struct

date{int

year,

month,

day;};struct

student{int

num;char

name

[20];struct

date

birthday;char

addr[30];}a,

*pa

=

&a;2結(jié)構(gòu)指針與數(shù)組型指針一樣,可以通過指針訪問結(jié)構(gòu)變量的成員(1)利用“*”和“.”實現(xiàn)間接訪問struct

student

a,

b,

*pa

=

&a,

*pb

=

&b;*pa

=

*pb;strcpy((*pa).name,

"Zhangsan");scanf("%s",(*pa).addr);scanf("%d",

&(*pa).num);(*pa).name與*的區(qū)別?2結(jié)構(gòu)指針判斷下列語句對錯

(*pa).num=12345; (*pa).name[0]="c";*((*pa).addr

+

2)

=

"6";++*((*pa).addr

+

3);*((*pa).addr

+

3)++;(*pa).addr

=

"12011";2結(jié)構(gòu)指針(2)利用成員選擇運算符“->”實現(xiàn)對結(jié)構(gòu)成員的訪問形式:結(jié)構(gòu)指針名->成員名“->”是雙目運算符,具有最高優(yōu)先級,左結(jié)合

“->”的左操作數(shù)是結(jié)構(gòu)類型的指針,右操作數(shù)為結(jié)構(gòu)成員結(jié)構(gòu)指針名->成員名等價于(*結(jié)構(gòu)指針名).成員名2結(jié)構(gòu)指針struct

student

a,

*pa

=

&a;?pa->namepa->num??a.num??(*pa).name(*pa).numa.birthday.year?(*pa).birthday.yearpa->birthday.year?(pa->birthday).year設(shè)有多種類型成員的嵌套結(jié)構(gòu)類型聲明如下:date{year;month[12];day;structintcharshort};struct

mul_type{charintfloatcharcharstructstructc;n;d;s[12];*ps;date

a;date

*pa;}m

=

{"a",100,3.14f,"myabcdefg",m.s,{2007,"July",

29},&m.a},*pm=&m;pm->pa->yearm.a.year(*pm).pa->yearm.pa->yearpm->a.year(*pm->pa).year(*m.pa).year(*(*pm).pa).year;等價主要內(nèi)容:結(jié)構(gòu)類型與結(jié)構(gòu)變量結(jié)構(gòu)指針結(jié)構(gòu)數(shù)組結(jié)構(gòu)與函數(shù)聯(lián)合與位段3結(jié)構(gòu)數(shù)組結(jié)構(gòu)數(shù)組是由相同結(jié)構(gòu)類型的元素構(gòu)成的數(shù)組

一維結(jié)構(gòu)數(shù)組是一種應用十分廣泛的數(shù)據(jù)結(jié)構(gòu),一般情況下都使用一維結(jié)構(gòu)數(shù)組

一維結(jié)構(gòu)數(shù)組特別適合描述通信錄、登記表、成績單以及編譯程序處理的符號表等二維表格數(shù)據(jù)二維表格中的每一行對應結(jié)構(gòu)數(shù)組的一個元素,每一列對應一種屬性,代表一個結(jié)構(gòu)成員的類型一維結(jié)構(gòu)數(shù)組中的元素又稱為記錄3結(jié)構(gòu)數(shù)組學生情況登記表student[0]student[1]student[2]…student[29]numnamesexagescore2129500張三m1883.52129501李四m1990.52129502王紅f1885.0……………2129529程萍f1987.03-1結(jié)構(gòu)數(shù)組的聲明結(jié)構(gòu)數(shù)組的聲明與一般數(shù)組的聲明類似struct

student

cs[5]

={{2129500,"張三","m",18,83.5},{2129501,"李四","m",18,90.5},{2129502,"王紅","m",18,85.0},{2129503,"田亮","m",19,87.0},{2129504,

"張靈",

"f",

18,

81.5},};struct

student{long

num;char

name

[10];char

sex;int

age;float

score;}class1[40];3-2結(jié)構(gòu)數(shù)組的使用結(jié)構(gòu)數(shù)組的使用指對結(jié)構(gòu)數(shù)組元素的引用和元素中成員的訪問及操作–引用結(jié)構(gòu)數(shù)組中的元素與引用普通數(shù)組元素的形式完全一樣for(i

=

0;

i

<

2;

i++){printf("%s\t",

class2[i].num);printf("%s\t",

class2[i].name);printf("%c\t",

class2[i].sex);}3-2結(jié)構(gòu)數(shù)組的使用struct

student

class1[30],

*p;例1:for(p

=

class1;

p

<

&class1[30];

p++){printf("\n%10ld%15s%4c%6hd%8.1f",

p->num,p->name,

p->sex,

p->age,

p->score);}例2:p

=

class1;(*p).num或(p+0)->num 表示引用class1[0].num(*(p+i)).num或(p+i)->num表示引用class1[i].num(*++p).num或(++p)->num 表示引用class1[1].num主要內(nèi)容:結(jié)構(gòu)類型與結(jié)構(gòu)變量結(jié)構(gòu)指針結(jié)構(gòu)數(shù)組結(jié)構(gòu)與函數(shù)聯(lián)合與位段4結(jié)構(gòu)與函數(shù)結(jié)構(gòu)作為函數(shù)的參數(shù)結(jié)構(gòu)作為函數(shù)的返回值4-1結(jié)構(gòu)作為函數(shù)參數(shù)將結(jié)構(gòu)的信息傳遞給函數(shù)有以下途徑:將結(jié)構(gòu)成員作為函數(shù)參數(shù)僅用到結(jié)構(gòu)的單個成員將整個結(jié)構(gòu)變量作為函數(shù)參數(shù)(傳值)函數(shù)對結(jié)構(gòu)變量的副本進行操作用指向結(jié)構(gòu)變量的指針作參數(shù)(傳址)對較大的結(jié)構(gòu)變量傳遞效率較高,僅傳遞一個指針將結(jié)構(gòu)數(shù)組作為函數(shù)的參數(shù)4-1-1結(jié)構(gòu)成員作為函數(shù)參數(shù)例如:–對2個物理量,量綱相同時可以進行物理量的相加操作typedef

struct{double

size;char

dimension[12];}motion;double

add_motion_size(double,

double);motion

b

=

{12.5,

"m/s"},

c

=

{26.7,

"m/s"},

d;d.size

=

add_motion_size(b.size,

c.size);4-1-2結(jié)構(gòu)變量作為函數(shù)參數(shù)例如:–對2個物理量,量綱相同時可以進行物理量的相加操作typedef

struct{double

size;char

dimension[12];}motion;double

add_motion_size(motion

u,

motion

v);motion

b

=

{12.5,

"m/s"},

c

=

{26.7,

"m/s"},

d;d.size

=

add_motion_size(b,

c);4-1-3結(jié)構(gòu)指針作為函數(shù)參數(shù)例如:–對2個物理量,量綱相同時可以進行物理量的相加操作typedef

struct{double

size;char

dimension[12];}motion;double

add_motion_size(motion

*u,

motion

*v);motion

b

=

{12.5,

"m/s"},

c

=

{26.7,

"m/s"},

d,

*pb=&b,*pc=&c;d.size

=

add_motion_size(pb,

pc);4-1-4結(jié)構(gòu)數(shù)組作為函數(shù)參數(shù)結(jié)構(gòu)數(shù)組作為函數(shù)的參數(shù)時一定要用結(jié)構(gòu)指針,形參應該聲明為數(shù)組元素結(jié)構(gòu)類型的指針實參用結(jié)構(gòu)數(shù)組名或者結(jié)構(gòu)數(shù)組首元素的地址例 結(jié)構(gòu)數(shù)組作為函數(shù)的參數(shù)的應用舉例:設(shè)計一個貨物結(jié)構(gòu)類型,定義對應的結(jié)構(gòu)數(shù)組。先進行數(shù)據(jù)輸入并顯示輸入的數(shù)據(jù),然后對價格按照降序排序并顯示排序后的結(jié)果1.2.#include

"stdio.h"#define

N

33.typedef

struct

{4.5.6./*貨物編碼*//*名稱*//*價格*/7.long

code;char

name[20];float

price;}GOODS;8.9.voidinput(GOODS

*p,

int

n);void

sort(GOODS

*p,

int

n);void

display(GOODS

*p,

int

n);void

main(void){12.13.GOODS

meat[N];input(meat,N);

/*結(jié)構(gòu)數(shù)組名作為實參*/14.15.display(&meat[0],

N);sort(meat,

N);display(meat,

N);16.17.

}18.18.18.18.

voidinput(GOODS

*p,int

n){int

i;

float

tmp;for(i

=

0;

i

<

n;

i++){scanf("%ld",

&p[i].code);18.18.18.18.scanf("%s",

(p+i)->name);scanf("%f",

&tmp);(*(p+i)).price

=

tmp;}18.

}18.

void

sort(GOODS

*p,

int

n){18.int

i,

j;

GOODS

t;18.18.18.for(i

=

0;

i

<

n-1;

i++)for(j

=

i

+

1;

j

<

n;

j++)if((p

+

i)->price

<

(p

+

j)->price){18.18.

t

=

*(p

+

i);

*(p

+

i)

=

*(p

+

j);

*(p

+

j)

=

t;}18.

}35.35.35.

void

display(GOODS

*p,

int

n)

{int

i;for(i

=

0;

i

<

n;

i++){35.printf("%ld\t",

(*(p

+

i)).code35.35.printf("%s\t",

(p

+

i)->name);printf("%f\n",

p[i].price);35.}35.

}4-2結(jié)構(gòu)作為函數(shù)返回值包括三種形式:將結(jié)構(gòu)成員作為函數(shù)返回值將整個結(jié)構(gòu)變量作為函數(shù)返回值用指向結(jié)構(gòu)變量的指針作函數(shù)返回值函數(shù)返回類型應與要返回的對象的類型一致4-2-1結(jié)構(gòu)成員作為函數(shù)返回值例如:typedef

struct{double

size;char

dimension[12];}motion;double

get_motion_size(motion

u){return

u.size;}date

get_student_birthday(student

stu){return

stu.birthday;}4-2-1結(jié)構(gòu)變量作為函數(shù)返回值例如:motion

get_motion(void){motion

a;printf("inputthe

value

of

member

size

and

dimension\n");scanf("%lf",

&a.size);scanf("%s",

a.dimension);return

a;}typedef

struct{double

size;char

dimension[12];}motion;4-2-1結(jié)構(gòu)指針作為函數(shù)返回值例如:typedef

struct{double

size;char

dimension[12];}motion;motion

*

get_motion(void){static

motion

a;printf("inputthe

value

of

member

size

and

dimension\n");scanf("%lf",

&a.size);scanf("%s",

a.dimension);return

&a;}主要內(nèi)容:結(jié)構(gòu)類型與結(jié)構(gòu)變量結(jié)構(gòu)指針結(jié)構(gòu)數(shù)組結(jié)構(gòu)與函數(shù)聯(lián)合與位段5-1聯(lián)合以變量、數(shù)組、結(jié)構(gòu)為載體的數(shù)據(jù)所代表的含義是固定不變的實際應用中,有些信息需要在不同場合表現(xiàn)為不同的數(shù)據(jù),如學生基本信息中與年齡相關(guān)的信息可以是實際年齡或出生日期,分別為整型和字符串–C語言通過聯(lián)合類型來實現(xiàn)5-1聯(lián)合聯(lián)合類型的變量由多個成員組成

這些成員并不同時存在,而是在不同時刻擁有不同的成員在同一時刻僅擁有其中一個成員

聯(lián)合變量的成員可以是任何類型的數(shù)據(jù),包括任何基本類型、指針類型、數(shù)組類型、結(jié)構(gòu)類型或其它聯(lián)合類型5-1聯(lián)合除了用關(guān)鍵字union取代struct之外,聯(lián)合類型在語法形式上與結(jié)構(gòu)完全相同例:union

chl{char

c;short

h;long

l;};5-1聯(lián)合union

chl

v

=

{"9"},

w

=

{"a"};聯(lián)合在同一時刻它只擁有其中的一個成員,在初始化時只能對第1個成員進行初始化,初值表中只能包含與第1個成員數(shù)據(jù)類型相同的一個初值union

chl{char

c;short

h;long

l;}v

=

"9",

w

=

"a";#include

"stdio.h"union

chl{charc;shorth;longl;1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.};void

show(union

chl

*pu);void

show_memory(union

chl

*pu);void

main(void){union

chl

u;printf("sizeofu

is

%d\n",

sizeof(u));u.l

=0x31323334L;show(&u);show_memory(&u);u.h

=

0x3638;show(&u);show_memory(&u);18.

}19.

void

show(union

chl

*pu){19.

printf("char

format:

%c\n",

(*pu).c);19.

printf("int

format:

%hx\n",

pu->h);19.

printf("long

format:

%lx\n",

(*pu).l);19.

}19.

voidshow_memory(union

chl

*pu){19.

char

*p

=

(char

*)pu;19.

int

i

=

0;19.

while(i

<

4)19.

{19.

printf("addr

%dth

byte

of

u

is

0x%p\t",

i,

p+i);19.

printf("the

ASCII

in

%dth

byte

of

u

is

%c\n",

i,

*(p+i));19.

i++;19.

}19.

}注意:使用聯(lián)合變量時,必須知道當前有效成員聯(lián)合的大小大于或等于最長成員的字節(jié)數(shù)可以聲明聯(lián)合類型的指針。如:union

chl

v,

*pv

=

&v;注意:

聯(lián)合所有成員的地址和聯(lián)合變量的地址都相同,不同成員指針值(地址值)的類型是不相同的

即:&u,&u.c,&u.h,&u.l的地址都相同。而&u的數(shù)

據(jù)類型是union

chl

*;&u.c的數(shù)據(jù)類型是char

*;&u.h的數(shù)據(jù)類型是int

short

*;&u.l的數(shù)據(jù)類型是long

int

*5-1聯(lián)合可以通過聯(lián)合變量和“.”操作符,以及指向聯(lián)合變量的指針和“->”操作符來引用聯(lián)合成員對聯(lián)合成員的引用形式為:(1)聯(lián)合變量名.成員名(2)(*指向聯(lián)合變量的指針).成員名(3)指向聯(lián)合變量的指針->成員名例如:u.c或(*pu).c或pu->c都表示引用聯(lián)合成員c,類型是char

u.c="a",(*pu).h=0x3839,以及pu->l=0x31323334L分別表示對聯(lián)合u的成員c、h、l的賦值操作5-1聯(lián)合聯(lián)合中允許存儲不同類型的數(shù)據(jù),對某個時刻存儲的數(shù)據(jù),其所允許的操作也有所不同,有些操作對該類型的數(shù)據(jù)是相容的,但有些操作卻不相容(得不到正確結(jié)果)由于語法上合法,編譯器對這種情況不會報錯,但運算的結(jié)果卻不正確5-1聯(lián)合5-2位段位段(bitfield)是指由多個相鄰的二進制位可以組成的結(jié)構(gòu)或者聯(lián)合中的整型或無符號整型成員以位段為成員的結(jié)構(gòu)稱為位段結(jié)構(gòu)組成位段的二進制位的數(shù)目成為該位段的寬度,它是一個非負的整型常量表達式位段結(jié)構(gòu)在操作系統(tǒng),編譯程序,計算機接口的C語言編程方面使用較多5-2位段例如,stdio.h中關(guān)于文件狀態(tài)成員flags的取值就規(guī)定了1為讀狀態(tài),2為寫狀態(tài),4為緩沖數(shù)據(jù)狀態(tài)等。這些數(shù)據(jù)都

是一些值很小的整數(shù),沒有必要用int(16bit)或char(8bit)量來存儲每一個值通常對若干個特征中的每個特征按照取值的大小分配合適的二進制位,然后將它們封裝到一個int或char變量中。這樣就可以通過位段名對相應的二進制位或位串進行操作,而不必采用位運算考慮十字路口的交通燈,顏色枚舉類型的聲明如下:enum

color{

OFF

=

0,

RED

=

1,

YELLOW

=

2,

GREEN

=

3}

溫馨提示

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

評論

0/150

提交評論