六構(gòu)造數(shù)據(jù)類(lèi)型課件_第1頁(yè)
六構(gòu)造數(shù)據(jù)類(lèi)型課件_第2頁(yè)
六構(gòu)造數(shù)據(jù)類(lèi)型課件_第3頁(yè)
六構(gòu)造數(shù)據(jù)類(lèi)型課件_第4頁(yè)
六構(gòu)造數(shù)據(jù)類(lèi)型課件_第5頁(yè)
已閱讀5頁(yè),還剩119頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

六構(gòu)造數(shù)據(jù)類(lèi)型回顧-1循環(huán)結(jié)構(gòu)的特點(diǎn)是,在給定條件成立時(shí),重復(fù)執(zhí)行某程序段,直到條件不成立為止while循環(huán)用于在給定條件為真的情況下重復(fù)執(zhí)行一組操作,while循環(huán)先判斷后執(zhí)行do-while循環(huán)先執(zhí)行后判斷,因此循環(huán)將至少執(zhí)行一次在循環(huán)中,需要修改循環(huán)變量的值以改變循環(huán)條件,否則有可能形成死循環(huán)循環(huán)嵌套必須將內(nèi)層循環(huán)完整的包含在外層循環(huán)中回顧-2for循環(huán)與while循環(huán)類(lèi)似,屬于先判斷后執(zhí)行for語(yǔ)句中有三個(gè)表達(dá)式:表達(dá)式1通常用來(lái)給循環(huán)變量賦初值;表達(dá)式2通常是循環(huán)條件;表達(dá)式3用來(lái)更新循環(huán)變量的值for語(yǔ)句中的各個(gè)表達(dá)式都可以省略,但要注意分號(hào)分隔符不能省略如果省略表達(dá)式2和表達(dá)式3,則需要在循環(huán)體內(nèi)設(shè)法結(jié)束循環(huán),否則會(huì)導(dǎo)致死循環(huán)回顧-3break語(yǔ)句用在循環(huán)中時(shí),可以直接終止循環(huán),將控制轉(zhuǎn)向循環(huán)后面的語(yǔ)句continue語(yǔ)句的作用是跳過(guò)循環(huán)體中剩余的語(yǔ)句而執(zhí)行下一次循環(huán)嵌套循環(huán)時(shí),必須將被嵌套的循環(huán)語(yǔ)句完整地包含在外層循環(huán)的循環(huán)體內(nèi)本章目標(biāo)理解數(shù)組、結(jié)構(gòu)體、指針的用途熟練掌握一維數(shù)組的使用掌握二維數(shù)組的使用掌握結(jié)構(gòu)體的使用掌握指針的使用熟悉數(shù)組、數(shù)組、指針的綜合使用1、數(shù)組數(shù)組的用途問(wèn)題: 已經(jīng)知道成都2008年3月份每天的溫度,求平均溫度。方法:定義31個(gè)變量,分別表示每天的溫度,然后求平均值?用數(shù)組更簡(jiǎn)單intindex;floatsum=0.0,avg,temperature[31];for(index=1;index<=31;index++){

scanf(“%f”,&temperature[index]);}for(index=1;index<=31;index++){ sum=sum+temperature[index];}avg=sum/31;C語(yǔ)言中的數(shù)組Rate1513973210Rate[

4

]數(shù)組名下標(biāo)標(biāo)明了元素在數(shù)組中的位置

數(shù)組元素下標(biāo)數(shù)組大小數(shù)組是可以在內(nèi)存中連續(xù)存儲(chǔ)多個(gè)元素的結(jié)構(gòu)數(shù)組中的所有元素必須屬于相同的數(shù)據(jù)類(lèi)型數(shù)組類(lèi)型聲明一維數(shù)組datatype

arrayName[size];類(lèi)型說(shuō)明符int、char、float…數(shù)組名常量表達(dá)式:數(shù)組大小intnum[50];charname[20];doublerate[6];#defineCOUNT20...int

student[COUNT

];數(shù)組初始化intarr[10]={10,9,8,7,6,5,4,3,2,1,0};

//錯(cuò)誤!越界了intarr[10]={9,8,7,5};//正確,后面的6個(gè)元素未初始化int

arr[]={9,8,7};

//正確(但要求不使用):元素個(gè)數(shù)為3int

arr[]={};

//錯(cuò)誤,到底是幾個(gè)元素??jī)?nèi)存為一維數(shù)組動(dòng)態(tài)賦值floatprice[4];printf(“Enterpricesof4books\n”);for(i=0;i<=3;i++){

scanf(“%f”,&price[i]);}price[0]price[1]price[2]price[3]price42.0090.5027.551.50數(shù)組在內(nèi)存的存放形式數(shù)組元素在內(nèi)存的存放:順序、連續(xù)一維數(shù)組mark[0]mark[1]mark[2]mark[3]...mark[99]86.592.077.552.0...94.0低地址

高地址下標(biāo)與地址的關(guān)系mark[0]mark[1]mark[2]mark[3]...mark[99]86.592.077.552.0...94.02000H2004H2008H200CH。。。218CH

[]

稱(chēng)為下標(biāo)運(yùn)算符。

數(shù)組名是數(shù)組的首地址,是一個(gè)地址常量。

數(shù)組元素則是數(shù)值。引用數(shù)組元素時(shí),根據(jù)首地址和下標(biāo),自動(dòng)計(jì)算出該元素的實(shí)際地址,取出該地址的內(nèi)容進(jìn)行操作。如引用mark[2]:(1)計(jì)算

2000+2*4=2008(2)取出2008的內(nèi)容一維數(shù)組示例#include<stdio.h>voidmain(){

inti; floatitem_rate[5],total=0;

printf("\n

請(qǐng)輸入商品價(jià)格:\n");

for(i=0;i<5;i++) {

scanf("%f",&item_rate[i]); total=total+item_rate[i]; }

printf(“\n所有商品的合計(jì)費(fèi)用:%f\n“,total);}

內(nèi)存循環(huán)執(zhí)行5次請(qǐng)輸入商品價(jià)格:35.5045.82340.780itotal00Item_rate35.5035.5045.82340.7806225.0所有商品的合計(jì)費(fèi)用:225.000000二維數(shù)組b[0][0]b[0][1]b[0][2]b[1][0]b[1][1]b[1][2]1234563000H3002H3004H3006H3008H300AH例如:整型數(shù)組bb[2][3]={ {1,2,3},

{4,5,6}};二維數(shù)組存放:

多維數(shù)組的元素按行順序存放。地址值數(shù)組元素先存放第

1

行的所有元素,再存放第

2

行的所有元素。二維數(shù)組的訪問(wèn)

inti,j,num[2][3];for(i=0;i<2;i++) { for(j=0;j<3;j++) {

num[i][j]=i*j; } }

一維數(shù)組的長(zhǎng)度在C中,使用ARRAY_LEN()宏來(lái)處理一維數(shù)組,可以提高程序的靈活性。#defineARRAY_LEN(x)(sizeof(x)/sizeof(x[0]))數(shù)組的使用#include<stdio.h>#defineCOUNT5#defineARRAY_LEN(x)(sizeof(x)/sizeof(x[0]))voidmain(void){

inti,number[COUNT];

printf("Pleaseenter%dnumber:\n",COUNT);for(i=0;i<ARRAY_LEN(number)

;i++){

scanf("%d",&number]);}}數(shù)組越界問(wèn)題(測(cè)試環(huán)境:VC++6.0)#include<string.h>#include<stdio.h>#defineCHAR_COUNT16voidAddOne(intcount,charp[]){

inti; for(i=0;i<=count;i++) {

p[i]=p[i]+1; }}數(shù)組越界問(wèn)題–續(xù)voidmain(void){

intcount=CHAR_COUNT; charstr[CHAR_COUNT]={0};

printf("Pleaseenteraword:\n");

scanf("%s",str);

AddOne(count,str);

printf("%d",count);

fflush(stdin);

getchar();}字符串?dāng)?shù)據(jù)字符串類(lèi)型charname[40]={0};C語(yǔ)言中沒(méi)有字符串?dāng)?shù)據(jù)類(lèi)型,一般用字符數(shù)組表示,因此字符串是數(shù)組的一種特例。字符數(shù)組與字符串的區(qū)別是:表示字符串的字符數(shù)組中至少有一個(gè)元素為字符’\0’,即字符串結(jié)束標(biāo)志2、結(jié)構(gòu)體結(jié)構(gòu)定義結(jié)構(gòu)定義的一般形式

struct

結(jié)構(gòu)類(lèi)型名稱(chēng)

{

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

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

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

};//此處必須有分號(hào)struct

為關(guān)鍵字。結(jié)構(gòu)類(lèi)型名稱(chēng)是所定義的結(jié)構(gòu)類(lèi)型標(biāo)識(shí),由用戶自己定義;{}

中包圍的是組成該結(jié)構(gòu)的成員;每個(gè)成員的數(shù)據(jù)類(lèi)型可以是任何類(lèi)型。結(jié)構(gòu)定義實(shí)例

為了描述日期可以定義如下結(jié)構(gòu):

structdate{

intyear;

intmonth;

intday; };為了處理通訊錄,可以定義如下結(jié)構(gòu):

structaddress{ charname[30]; //姓名。

charstreet[40];//街道名稱(chēng)

charcity[20]; //城市

charstate[2];//省市代碼

unsignedlongzip; //郵政編碼};結(jié)構(gòu)變量說(shuō)明結(jié)構(gòu)變量說(shuō)明的一般形式

struct

結(jié)構(gòu)類(lèi)型名稱(chēng)結(jié)構(gòu)變量名; 系統(tǒng)為所說(shuō)明的結(jié)構(gòu)變量按照結(jié)構(gòu)定義時(shí)說(shuō)明的組成(成員分量),分配存儲(chǔ)數(shù)據(jù)的實(shí)際內(nèi)存單元。 例:將變量today說(shuō)明為date型的結(jié)構(gòu)變量:

structdatetoday;

說(shuō)明多個(gè)address型的結(jié)構(gòu)變量:

structaddress

wang,li,zhang;結(jié)構(gòu)變量占用內(nèi)存情況

結(jié)構(gòu)變量的各個(gè)分量在內(nèi)存中占用連續(xù)存儲(chǔ)區(qū)域,所占內(nèi)存大小為每個(gè)分量占用內(nèi)存的長(zhǎng)度之和。4字節(jié)4字節(jié)4字節(jié)today(structdate)12個(gè)字節(jié)yearmonthdaywang(structaddress)96個(gè)字節(jié)30字節(jié)40字節(jié)20字節(jié)2字節(jié)4字節(jié)namestreetcitystatezipintcharunsignedlong結(jié)構(gòu)變量中的成員分量引用結(jié)構(gòu)變量中的成員分量訪問(wèn)結(jié)構(gòu)中的成員是通過(guò)成員的名字。在程序中使用結(jié)構(gòu)中成員的方法為:

結(jié)構(gòu)變量名.成員名稱(chēng) 例:將“92/10/01”送入結(jié)構(gòu)變量today,對(duì)其各個(gè)成員分別賦值:

today.year=92;

today.month=10;

today.day=1;指明結(jié)構(gòu)成員的符號(hào)“.”是運(yùn)算符,含義是訪問(wèn)結(jié)構(gòu)中的成員?!?”操作的優(yōu)先級(jí)最高。結(jié)合性為從左到右。

結(jié)構(gòu)體賦值規(guī)范:today.year=YearOf(Now);today.month=MonthOf(Now);today.day=DayOf(Now);today.year =YearOf(Now);today.month =MonthOf(Now);today.day =DayOf(Now);結(jié)構(gòu)體的用途使用結(jié)構(gòu)化數(shù)據(jù)可以明確表明數(shù)據(jù)間的關(guān)系Name =InputName;Address =InputAddress;Phone =InputPhone;Title =InputTitle;Department=InputDepartment;Bonus =InputBonus;Employee.Name =InputName;Empployee.Address =InputAddress;Employee.Phone =InputPhone;Supervisor.Title =InputTitle;Supervisor.Department =InputDepartment;Supervisor.Bonus =InputBonus;使用結(jié)構(gòu)化數(shù)據(jù)來(lái)簡(jiǎn)化對(duì)成塊數(shù)據(jù)的操作結(jié)構(gòu)體之間可以直接賦值,避免了多個(gè)成員直接賦值的問(wèn)題可以在結(jié)構(gòu)體中增加一個(gè)元素,而賦值語(yǔ)句不變使用結(jié)構(gòu)化數(shù)據(jù)來(lái)簡(jiǎn)化參數(shù)表

可以通過(guò)使用結(jié)構(gòu)化數(shù)據(jù)來(lái)簡(jiǎn)化子程序參數(shù)表位域(位段)有些信息在存儲(chǔ)時(shí),并不需要占用一個(gè)完整的字節(jié),而只需占幾個(gè)或一個(gè)二進(jìn)制位。例如在存放一個(gè)開(kāi)關(guān)量時(shí),只有0和1兩種狀態(tài),用一位二進(jìn)位即可。航空設(shè)備(例如:飛機(jī))上的使用的ARINC429總線上傳輸?shù)臄?shù)據(jù)只能是一個(gè)32位的數(shù)據(jù),使用的一個(gè)或多個(gè)位表示信息,因此只能使用位域。位域的定義格式

struct

位域結(jié)構(gòu)名

{

位域1;

位域2;

位域3;

位域4;};//定義在前面的是低位,后面是高位其中位域列表的形式為:類(lèi)型說(shuō)明符位域名:位域長(zhǎng)度;

typedefunsignedcharUInt8;typedef

struct

{UInt8Bit0:1;UInt8Bit1:1;UInt8Bit2:1;UInt8Bit3:1;UInt8Bit4:1;UInt8Bit5:1;UInt8Bit6:1;UInt8Bit7:1;}rec8Bit;//表示一個(gè)包含8個(gè)二進(jìn)制位的結(jié)構(gòu)體;

1.位域在本質(zhì)上就是一種結(jié)構(gòu)體類(lèi)型,不過(guò)其成員是按二進(jìn)位分配的。2.位域的基本數(shù)據(jù)類(lèi)型可以是unsignedchar,unsignedshort,unsignedint(long),因此位域中各元素的長(zhǎng)度不能超過(guò)基本數(shù)據(jù)類(lèi)型的長(zhǎng)度。

3.位域可以無(wú)位域名,這時(shí)它只用來(lái)作填充或調(diào)整位置。無(wú)名的位域是不能使用的。例如:

structk

{

inta:1;

int:2;/*該2位不能使用*/

intb:3;

intc:2;

};3、枚舉枚舉類(lèi)型是允許對(duì)某一類(lèi)對(duì)象的每一個(gè)成員都用英語(yǔ)來(lái)進(jìn)行描述類(lèi)型通常知道該對(duì)象的所有可能值所有值都是常量enum

枚舉名

{

枚舉值表;};

在枚舉值表中應(yīng)羅列出所有可用值。這些值也稱(chēng)為枚舉元素。例如:enumweekday

{sun,mou,tue,wed,thu,fri,sat};

該枚舉名為weekday,枚舉值共有7個(gè),即一周中的七天。凡被說(shuō)明為weekday類(lèi)型變量的取值只能是七天中的某一天。枚舉類(lèi)型的使用enumCOLOR{COLOR_INVALID,COLOR_RED,COLOR_GREEN,COLOR_BLUE};enumCOLORselectedColor;selectedColor=COLOR_RED;使用枚舉類(lèi)型的好處使用枚舉類(lèi)型來(lái)提高可讀性和修改性

if(COLOR_RED==ChosenColor)比

if(1==ChosenColor

)含義更明確。用枚舉類(lèi)型來(lái)代替邏輯變量如果有兩種以上的結(jié)果,則使用Success,Warning和FatalError

三個(gè)值比Success和Failure更好。4、sizeof運(yùn)算符用于構(gòu)造數(shù)據(jù)類(lèi)型基本數(shù)據(jù)類(lèi)型所占存儲(chǔ)空間sizeof(int) =4sizeof(short) =2sizeof(long) =4sizeof(char) =1sizeof(float) =4sizeof(double) =8sizeof(指針變量) =4sizeof(string) =字符個(gè)數(shù)+1sizeof(struct) =各成員所占空間之和(???)sizeof(array) =類(lèi)型所占空間乘元素個(gè)數(shù)一個(gè)中文漢字占兩個(gè)字節(jié)#include<stdio.h>int

main(int

argc,char*argv[]){chargender[4]="男";

printf("gender=%s\n",gender);

printf("sizeof(男)=%d\n",sizeof("男"));

printf("sizeof(gender)=%d\n",sizeof(gender));

system("PAUSE");return0;}數(shù)組的存儲(chǔ)空間#include<stdio.h>structdate{

intyear;intmonth;intday;};int

main(void){charletter[10];intnumber[10];doublerate[10];

structdatebirthday[10];

printf("sizeof(letter)=%d\n",sizeof(letter));

printf("sizeof(number)=%d\n",sizeof(number));

printf("sizeof(rate)=%d\n",sizeof(rate));

printf("sizeof(birthday)=%d\n",sizeof(birthday));}sizeof_array.c結(jié)構(gòu)體的存儲(chǔ)空間#include<stdio.h>structdate{

intyear;

intmonth;

intday;};voidmain(void){

structdatetoday;

structdatebirthday[10];

printf("sizeof(today)=%d\n",sizeof(today));

printf("sizeof(birthday)=%d\n",sizeof(birthday));}sizeof_struct.c結(jié)構(gòu)體對(duì)齊問(wèn)題#include<stdio.h>structstudent{charname[4];shortage;chargender;};voidmain(void){

printf("sizeof(structstudent)=%d\n",sizeof(structstudent));}結(jié)構(gòu)體的長(zhǎng)度一般是結(jié)構(gòu)體里面最長(zhǎng)的數(shù)據(jù)元素(類(lèi)型)的整數(shù)倍。如果結(jié)構(gòu)體內(nèi)存在長(zhǎng)度大于處理器位數(shù)的元素,那么就以處理器的位數(shù)為對(duì)齊單位。未全部使用的位域定義struct

recSwitchStatus{

intD1:1;

intD2:1;

intD3:1;

intD4:1;};//sizeof(recSwitchStatus)=4,因?yàn)榛绢?lèi)型為int枚舉、字符串的存儲(chǔ)空間#include<stdio.h>enumweekday{

sun,mou,tue,wed,thu,fri,sat};int

main(void){

enumweekdaygiveDay;charstrArray[]="Welcome";char*strPointer="Welcome";

printf("sizeof(giveDay)=%d\n",sizeof(giveDay));

printf("sizeof(strArray)=%d\n",sizeof(strArray));

printf("sizeof(strPointer)=%d\n",sizeof(strPointer));}sizeof_other.c5、指針求兩個(gè)數(shù)之和#include<stdio.h>voidmain(void){

intadd1,add2,sum;

scanf("%d%d",&add1,&add2);sum=add1+add2;

printf("%d+%d=%d",add1,add2,sum);}變量地址變量add1,add2,sum的地址假設(shè)add1的值為10,add2的值為20,則sum為30......102030......intadd1;intadd2;intsum;(0x22FF74)int*pAdd1;(0x22FF70)int*pAdd2;(0x22FF6C)int*pSum;變量地址內(nèi)存布局變量名指針#include<stdio.h>voidmain(void){

intadd1,add2,sum;//(0x22FF74),(0x22FF70),(0x22FF6C)

scanf("%d%d",&add1,&add2);

//scanf("%d%d",(0x22FF74),(0x22FF70));sum=add1+add2;

//(0x22FF6C)=(0x22FF74)+(0x22FF70);

printf("%d+%d=%d",add1,add2,sum);

//printf("%d+%d=%d",(0x22FF74),(0x22FF70),(0x22FF6C));}變量名在變量編譯后用地址表示(偏移量表示)由于在編寫(xiě)代碼時(shí)不知道變量的地址,即使知道,地址也很難記憶,因此在需要訪問(wèn)變量的地址時(shí)用指針變量來(lái)表示變量的值和地址程序輸入add1輸入add2計(jì)算sum1020存儲(chǔ)sum30內(nèi)存FB0C(add1)FB08(add2)FB04(sum)定義add1,add2,sum指針也是一個(gè)變量,只不過(guò)該變量中存儲(chǔ)的是另一個(gè)對(duì)象的內(nèi)存地址如果一個(gè)變量存儲(chǔ)另一個(gè)對(duì)象的地址,則稱(chēng)該變量指向這個(gè)對(duì)象由于指針值是數(shù)據(jù),指針變量可以賦值,所以一個(gè)指針的指向在程序執(zhí)行中可以改變。指針p在執(zhí)行中某時(shí)刻指向變量x,在另一時(shí)刻也可以指向變量y指針簡(jiǎn)介

變量與地址程序中:inti;

floatk;

內(nèi)存中每個(gè)字節(jié)有一個(gè)編號(hào)-----地址…...…...200020042007內(nèi)存0xhhhhik

編譯或函數(shù)調(diào)用時(shí)為其分配內(nèi)存單元變量是對(duì)程序中數(shù)據(jù)存儲(chǔ)空間的抽象指針與指針變量…...…...2000200420062005整型變量i10變量i_pointer200120022003指針:一個(gè)變量的地址指針變量:專(zhuān)門(mén)存放變量地址的變量2000指針指針變量

變量的內(nèi)容

變量的地址i_pointer=&ii=*i_pointer指針運(yùn)算符&與*運(yùn)算符含義含義:取變量的地址含義:

取指針?biāo)赶蜃兞康膬?nèi)容兩者關(guān)系:互為逆運(yùn)算理解…...…...2000200420062005整型變量

i10變量i_pointer2001200220032000指針變量i_pointer-----指針變量,它的內(nèi)容是地址量*i_pointer----指針的目標(biāo)變量,它的內(nèi)容是數(shù)據(jù)&i_pointer---指針變量占用內(nèi)存的地址i_pointer&ii*i_pointer指針變量指針變量的定義一般形式:數(shù)據(jù)類(lèi)型*指針名;合法標(biāo)識(shí)符指針的目標(biāo)變量的數(shù)據(jù)類(lèi)型表示定義指針變量不是‘*’運(yùn)算符例int

*p1,*p2;

注意:1、int*p1,*p2;

指針變量名是p1,p2,不是*p1,*p22、指針變量只能指向定義時(shí)所規(guī)定類(lèi)型的變指針變量的初始化和賦值指針變量的初始化一般形式:數(shù)據(jù)類(lèi)型*指針名=初始地址值;例inti1,i2,i3;

int*pi1=&i1,*pi2=&i2;pi1=&i3;pi2=pi1;指針變量的名稱(chēng)通常是在它指向的變量(或數(shù)據(jù)類(lèi)型)前加一個(gè)p來(lái)表示。指針運(yùn)算實(shí)例實(shí)例:已知:int

x=2,y,*px;x為一般變量,px為指針型變量px

px

=&x; 取變量x的地址賦值給指針px

又稱(chēng)為讓px指向變量x

x=10;若px已經(jīng)指向x,則可以用*px

代替變量xx210<==>

*px

=10;也稱(chēng)為間接訪問(wèn)

y=x; <==>y=*px;

取指針px的內(nèi)容指針的基本運(yùn)算指針的基本運(yùn)算是賦予不同的地址…...…...pi2pi1pi1=pi2;實(shí)質(zhì)上是pi1的值發(fā)生了變化,這種方式很危險(xiǎn),如果pi1原來(lái)指向的是動(dòng)態(tài)分配內(nèi)存,則執(zhí)行pi1=pi2后,pi1原來(lái)指向的內(nèi)存區(qū)域?qū)⒊蔀闊o(wú)法訪問(wèn)的“懸掛內(nèi)存”,如果是頻繁進(jìn)行這種操作,則最終將消耗完所有內(nèi)存指針加減運(yùn)算指針與小整數(shù)加減表示指針在內(nèi)存空間向下或向上移動(dòng);移動(dòng)單位是其基類(lèi)型的長(zhǎng)度

當(dāng)指針p指向數(shù)組中的元素時(shí),n(一般為1)為正整數(shù):

p+n表示:指針p所指向當(dāng)前元素之后的第n個(gè)元素;

p-n表示:指針p所指向當(dāng)前元素之前的第n個(gè)元素。

p+4p+5p+6p+7p+8............p+3............數(shù)組低地址高地址指針的存儲(chǔ)空間:sizeof_pointer.c#include<stdio.h>structdate{intyear;intmonth;intday;};int

main(void){

inti,*pInt=&i;

structdatetoday,*pToday=&today;

intintArray[10],*pIntArray=intArray;

printf("sizeof(pInt)=%d\n",sizeof(pInt));

printf("sizeof(pToday)=%d\n",sizeof(pToday));

printf("sizeof(pIntArray)=%d\n",sizeof(pIntArray));}規(guī)則:所有指針變量的所占的存儲(chǔ)空間都是4個(gè)字節(jié),不管它是指向什么類(lèi)型的變量指針使用總則隨時(shí)關(guān)注指針變量所指向的內(nèi)容。初始化使用過(guò)程中,指針指向的當(dāng)前位置使用后(如果時(shí)動(dòng)態(tài)分配內(nèi)存,則需要清除)基本類(lèi)型與指針intswap(int*p1,int*p2){

inttemp=*p1; *p1=*p2; *p2=temp;}intpara1=1,para2=2,result;result=swap(¶1,¶2);數(shù)組與指針數(shù)組與指針 數(shù)組中的每個(gè)元素都可以通過(guò)下標(biāo)唯一確定,即通過(guò)下標(biāo)可以訪問(wèn)(操作)數(shù)組中的元素,稱(chēng)為下標(biāo)方式。 也可以通過(guò)數(shù)組下標(biāo)方式完成的訪問(wèn)(操作)均可以通過(guò)指針?lè)绞綄?shí)現(xiàn)。稱(chēng)為指針?lè)绞?。假設(shè):floatrate[100];

數(shù)組名:數(shù)組的標(biāo)識(shí)rate

數(shù)組元素的地址:數(shù)組中一個(gè)具體元素的地址(&rate[k])

數(shù)組首地址(數(shù)組起始地址):數(shù)組中第一個(gè)元素(0號(hào)元素)的地址(&rate[0]或用數(shù)組的名稱(chēng)

rate

表示)。那么下面關(guān)系表達(dá)式成立:

rate==&rate[0]inti,array[10];p=array;for(i=0;i<ARRAY_LEN(array);i++){ *p=i; p++;

}for(i=0;i<ARRAY_LEN(array);i++){

printf(“%d”,*p); p++;

}數(shù)組與指針例intarray[10];

int*p;

p=&array[0];或int*p=&array[0];或int*p=array;&array[0]整型指針parray[0]array[1]array[2]array[3]array[9]...p數(shù)組名是表示數(shù)組首地址的地址常量p=array;#include<stdio.h>#defineARRAY_LEN(x)(sizeof(x)/sizeof(x[0]))int

main(void){

inti,rate[5];

printf("valueofrateis:%x\n",rate);for(i=0;i<ARRAY_LEN(rate)

;i++){

printf("addressofrate[%d]is:%x\n",i,&rate[i]);}return0;}intrate[5];rate==&rate[0]數(shù)組元素表示方法01239...aa+9a+1a+2地址元素下標(biāo)法a[0]a[1]a[2]a[9]01239...pp+9p+1p+2地址元素指針變量法*p*(p+1)*(p+2)*(p+9)inta[10];int*p=a;數(shù)組與指針的差異規(guī)則1數(shù)組名指代一種數(shù)據(jù)結(jié)構(gòu),這種數(shù)據(jù)結(jié)構(gòu)就是數(shù)組;規(guī)則2數(shù)組名可以轉(zhuǎn)換為指向其指代實(shí)體的指針,而且是一個(gè)指針常量,不能作自增、自減等操作,不能被修改,但可以參與運(yùn)算;規(guī)則3指向數(shù)組的指針則是另外一種變量類(lèi)型(在WIN32平臺(tái)下,長(zhǎng)度為4),僅僅意味著數(shù)組的存放地址;規(guī)則4數(shù)組名作為函數(shù)形參時(shí),在函數(shù)體內(nèi),其失去了本身的內(nèi)涵,僅僅只是一個(gè)指針;字符串與指針字符串定義

char*pName="ZhangSan\n";charstrName[100]="ZhangSan\n";

方式1和方式2都定義了一個(gè)字符串兩種字符串定義的區(qū)別char*pName="ZhangSan\n";charstrName[100]="ZhangSan\n";

在有些開(kāi)發(fā)工具中,pName指向數(shù)據(jù)常量區(qū)域,因此不能通過(guò)pName修改其值。修改字符串常量#include<stdio.h>#include<stdlib.h>int

main(int

argc,char*argv[]){char*pName="ZhangSan\n";

puts(pName);pName[0]=‘z’;//運(yùn)行時(shí)出錯(cuò)

puts(pName);}數(shù)組不能在定義后整體賦值,在定義時(shí)可以

charstrName2[100];strName2="ZhangSan\n";

而strName是數(shù)組名稱(chēng),指向固定的地址,因此上面給strName2賦值是錯(cuò)誤的。結(jié)構(gòu)體與指針結(jié)構(gòu)體的地址#include<stdio.h>structdate{

intyear;

intmonth;

intday;};int

main(void){

structdatetoday;

printf("todayaddr:%x\n",&today);

printf("today.year

addr:%x\n",&today.year);

printf("today.month

addr:%x\n",&today.month);

printf("today.day

addr:%x\n",&today.day); return0;}structDate{

intyear;

intmonth;

intday;};structDatetoday;today==&today.year指向結(jié)構(gòu)體變量的指針structdatetoday;structdate*pToday;pToday=&today;可以定義一個(gè)指向結(jié)構(gòu)體變量的指針結(jié)構(gòu)體變量.成員名: today.year(*指針).成員名 : (*pToday).year指針->成員名 :

pToday->year4字節(jié)4字節(jié)4字節(jié)structdatetoday;structdate*pToday=&today;yearmonthday......pToday語(yǔ)句pToday->day=12;的執(zhí)行如下:1、根據(jù)pToday的值,找到該地址在內(nèi)存中的位置;2、根據(jù)pToday的類(lèi)型,把pToday的值開(kāi)始到pToday的值+sizeof(*)這一段存儲(chǔ)空間看作一個(gè)結(jié)構(gòu)體;3、根據(jù)結(jié)構(gòu)體的定義,得到day成員的偏移地址為+8,找到day成員的存儲(chǔ)區(qū),然后賦值;結(jié)構(gòu)體指針#include<stdio.h>structdate{

intyear;

intmonth;

intday;};voidmain(void){

structdatetoday;

structdate*pToday=&today;

today.day=28;

pToday->month=28;}利用指針可以實(shí)現(xiàn)不同數(shù)據(jù)類(lèi)型(構(gòu)造型)的轉(zhuǎn)換整型到字符型類(lèi)型轉(zhuǎn)換#include<stdio.h>voidmain(void){

inti=0;

inta=0x31323334; char*ch=(char*)&a;

for(i=0;i<4;i++) {

printf("ch%d=0x%x(%c)\n",i,ch+i,*(ch+i)); }

getchar();整型到字符型類(lèi)型轉(zhuǎn)換---運(yùn)行結(jié)果整型到位域的數(shù)據(jù)類(lèi)型轉(zhuǎn)換#include<stdio.h>typedefunsignedintUInt32;typedef

struct

{UInt32byte1:8;UInt32byte2:8;UInt32byte3:8;UInt32byte4:8;}rec4Byte;整型到位域的數(shù)據(jù)類(lèi)型轉(zhuǎn)換--續(xù)voidmain(void){

inta =0x31323334; rec4Byte*p4Byte=(rec4Byte*)&a;

printf("byte1=0x%x\n",p4Byte->byte1); printf("byte2=0x%x\n",p4Byte->byte2); printf("byte3=0x%x\n",p4Byte->byte3); printf("byte4=0x%x\n",p4Byte->byte4);

getchar();}整型到位域的數(shù)據(jù)類(lèi)型轉(zhuǎn)換--運(yùn)行結(jié)果

要把一個(gè)字節(jié)轉(zhuǎn)換為8個(gè)二進(jìn)制位呢?動(dòng)態(tài)分配內(nèi)存動(dòng)態(tài)分配內(nèi)存(malloc

和free函數(shù))malloc函數(shù)原型:void*malloc(unsigned

int

num_bytes);功能:分配長(zhǎng)度為num_bytes字節(jié)的內(nèi)存塊

說(shuō)明:如果分配成功則返回指向被分配內(nèi)存的指針,否則返回空指針NULL。

注意:當(dāng)內(nèi)存不再使用時(shí),應(yīng)使用free()函數(shù)將內(nèi)存塊釋放。

free函數(shù)原型原型:voidfree(void*ptr)功能:只能釋放使用malloc函數(shù)分配的內(nèi)存塊

malloc和free使用規(guī)則規(guī)則1不要為了用malloc而用

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論