




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- T-ZZB Q071-2024 酶底物法微生物智能培養(yǎng)計(jì)數(shù)一體機(jī)
- T-ZJHIA 16-2024 特殊醫(yī)學(xué)用途配方食品臨床營(yíng)養(yǎng)治療營(yíng)養(yǎng)篩查數(shù)據(jù)集
- 二零二五年度離婚協(xié)議中夫妻共同財(cái)產(chǎn)清算補(bǔ)充協(xié)議
- 二零二五年度直播帶貨主播合作權(quán)益保障合同
- 2025年度智能制造合作伙伴協(xié)議書(shū)
- 二零二五年度木制家具生產(chǎn)廠木工用工協(xié)議書(shū)
- 二零二五年度車(chē)輛掛靠運(yùn)輸合同車(chē)輛運(yùn)輸合同安全保障協(xié)議
- 二零二五年度個(gè)人租賃帶太陽(yáng)能熱水系統(tǒng)住宅合同
- 二零二五年度餐飲行業(yè)知識(shí)產(chǎn)權(quán)保護(hù)協(xié)議
- 二零二五年度兼職攝影師聘用合同模板
- 家校共育之道
- DeepSeek入門(mén)寶典培訓(xùn)課件
- 西安2025年陜西西安音樂(lè)學(xué)院專(zhuān)職輔導(dǎo)員招聘2人筆試歷年參考題庫(kù)附帶答案詳解
- 《作文中間技巧》課件
- 廣東省2025年中考物理仿真模擬卷(深圳)附答案
- 2025屆八省聯(lián)考 新高考適應(yīng)性聯(lián)考英語(yǔ)試題(原卷版)
- 新蘇教版一年級(jí)下冊(cè)數(shù)學(xué)第1單元第3課時(shí)《8、7加幾》作業(yè)
- 2024年山東電力高等專(zhuān)科學(xué)校高職單招職業(yè)技能測(cè)驗(yàn)歷年參考題庫(kù)(頻考版)含答案解析
- 2024年電力交易員(高級(jí)工)職業(yè)鑒定理論考試題庫(kù)(單選題、多選題、判斷題)
- 《平面廣告賞析》課件
- 【公開(kāi)課】同一直線上二力的合成+課件+2024-2025學(xué)年+人教版(2024)初中物理八年級(jí)下冊(cè)+
評(píng)論
0/150
提交評(píng)論