級(jí)面向?qū)ο蟪绦蛟O(shè)計(jì)課件一部分_第1頁(yè)
級(jí)面向?qū)ο蟪绦蛟O(shè)計(jì)課件一部分_第2頁(yè)
級(jí)面向?qū)ο蟪绦蛟O(shè)計(jì)課件一部分_第3頁(yè)
級(jí)面向?qū)ο蟪绦蛟O(shè)計(jì)課件一部分_第4頁(yè)
級(jí)面向?qū)ο蟪绦蛟O(shè)計(jì)課件一部分_第5頁(yè)
已閱讀5頁(yè),還剩75頁(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)介

第6章指針與引用本章介紹指針和引用基本知識(shí):指針的聲明、指針的運(yùn)算、void和const指針、引用的聲明及使用;討論指針與數(shù)組、指針與函數(shù)、引用與函數(shù)的關(guān)系。

指針是保存內(nèi)存地址的變量。通過(guò)指針,程序員可以直接管理計(jì)算機(jī)內(nèi)存。正確地使用指針,可以有效地表示更加復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。此外,C++指針還可以用在函數(shù)的傳址調(diào)用等場(chǎng)合,使得C++的功能非常強(qiáng)大。指針是C++語(yǔ)言從C語(yǔ)言中繼承來(lái)的重要概念,是C++語(yǔ)言最重要的特色之一。指針的正確使用是C++語(yǔ)言的學(xué)習(xí)重點(diǎn)之一?!?/p>

指針】計(jì)算機(jī)內(nèi)存劃分為內(nèi)存單元,這些內(nèi)存單元按其順序進(jìn)行編址。程序運(yùn)行時(shí),系統(tǒng)將利用內(nèi)存存儲(chǔ)相關(guān)的數(shù)據(jù)。【

數(shù)據(jù)存儲(chǔ)】程序中的每個(gè)變量在其生存期內(nèi)存儲(chǔ)的位置是不變的,具有固定的存儲(chǔ)地址。數(shù)據(jù)在內(nèi)存中的存儲(chǔ)方式是:按其所屬的數(shù)據(jù)類型,占據(jù)一定數(shù)量的連續(xù)內(nèi)存單元。C++程序運(yùn)行時(shí),系統(tǒng)會(huì)自動(dòng)地根據(jù)變量數(shù)據(jù)類型為該變量分配相應(yīng)的內(nèi)存。必要時(shí)可以使用取地址運(yùn)算符“&”來(lái)獲取變量的地址。指針變量是用于存放內(nèi)存地址的變量??蓪⒆兞康牡刂繁4嬖谥羔樧兞恐辛谐龅幕愋筒⒉皇侵羔樧兞勘旧淼念愋?,而是指針用于保存的地址值中存儲(chǔ)的變量的數(shù)據(jù)類型,即指針?biāo)赶蜃兞康臄?shù)據(jù)類型。指針變量,必須先聲明,后使用。其聲明的一般形式如下:

基類型*指針變量名;標(biāo)識(shí)符給出的是指針變量名?!?”號(hào)說(shuō)明其后的變量是一個(gè)指針變量?;愋涂梢允荂++語(yǔ)言中任一合法的類型?!?/p>

指針變量的聲明及使用】說(shuō)明:聲明了p1、p2兩個(gè)指針。其中p1指向int型變量,p2指向double型變量。比如:int*p1; double*p2;使用指針前,必須首先給它賦一個(gè)合法的值。否則,程序中對(duì)指針的訪問(wèn)有可能導(dǎo)致系統(tǒng)崩潰。注與其他變量一樣,指針可以通過(guò)初始化來(lái)賦值。比如:inti,*p1=&i; int*p2=0;說(shuō)明:第1個(gè)聲明就將指針p1的值初始化為變量i的內(nèi)存地址;第2個(gè)聲明將指針p2的值初始化為0。值為0的指針叫空指針。如果在聲明時(shí),指針初始化為0或根本沒(méi)有初始化,使用前,就必須首先給它賦有意義的值。比如:inti,*p1;

p1=&i;數(shù)組名表示的是該數(shù)組的首地址值,如果聲明指針指向一個(gè)數(shù)組。就可以使用下述賦值方法:

intx[5],*px=x;把指針px初始化為指向數(shù)組intx[5]的指針,即指針px指向數(shù)組的第一個(gè)元素。不需要使用取地址運(yùn)算符“&”。等價(jià)intx[5],*px=&x[0];說(shuō)明:沒(méi)有明確地給指針賦一個(gè)地址值,因而其值是隨機(jī)的。將輸出變量i的值1比如:inti=1,*p=&i; cout<<*p;*p=2;

cout<<*p;輸出2例如 int*p; *p=2;//錯(cuò)誤,指針p沒(méi)有賦值

使用指針前,必須首先給它賦一個(gè)合法的值。注利用指針來(lái)訪問(wèn)變量需要使用間接訪問(wèn)運(yùn)算符“*”。通過(guò)“*”運(yùn)算訪問(wèn)目的數(shù)據(jù)的過(guò)程也稱為“間接尋址”過(guò)程。傳值調(diào)用減少了主調(diào)函數(shù)與被調(diào)函數(shù)之間的數(shù)據(jù)依賴,被調(diào)函數(shù)對(duì)形參值的任何改變不會(huì)影響到實(shí)參。利用指針,形參的改變對(duì)相應(yīng)的實(shí)參有效?!?/p>

指針作為函數(shù)參數(shù)】函數(shù)的某個(gè)參數(shù)是指針,對(duì)這個(gè)函數(shù)的調(diào)用就是傳址調(diào)用。在進(jìn)行傳址調(diào)用時(shí),函數(shù)的實(shí)參傳遞給形參的是一個(gè)地址,從而使得形參指針和實(shí)參指針指向同一個(gè)地址。被調(diào)函數(shù)中對(duì)形參指針?biāo)赶虻牡刂分袃?nèi)容的任何改變都會(huì)影響到實(shí)參。例6-1交換兩個(gè)整數(shù)#include<iostream>usingnamespacestd;intmain(void){voidswap(int*p1,int*p2);int*point_1,*point_2,a,b;cin>>a>>b;point_1=&a;point_2=&b;if(a<b)swap(point_1,point_2);cout<<″Inmainfunction:″<<endl;cout<<″max=″<<a<<″min=″<<b<<endl;return0;}voidswap(int*p1,int*p2){inttemp;temp=*p1;*p1=*p2;*p2=temp;}

采用傳址調(diào)用時(shí),被調(diào)函數(shù)中形參指向的值的改變對(duì)實(shí)參有效。78(輸入兩個(gè)整數(shù))max=78min=45指針變量也是一個(gè)變量,在內(nèi)存中也需占據(jù)一定的空間,具有一個(gè)地址,這個(gè)地址也可以利用指針變量來(lái)保存。聲明一個(gè)指針來(lái)指向它,這個(gè)指針?lè)Q為指向指針的指針,也即二級(jí)指針。聲明二級(jí)指針的形式如下:

數(shù)據(jù)類型**標(biāo)識(shí)符比如:inti,*p=&i; int**pp=&p;指通過(guò)兩次間接尋址后所訪問(wèn)的變量的類型。標(biāo)識(shí)符為指針名。兩個(gè)“*”號(hào)表示二級(jí)指針。聲明了一個(gè)二級(jí)指針pp,它指向指針p。

通過(guò)二級(jí)指針訪問(wèn)目的單元中的數(shù)據(jù)值必須使用兩個(gè)“*”號(hào)。注【

指向指針的指針】數(shù)組名表示的是該數(shù)組的首地址值,是指向數(shù)組第一個(gè)元素的指針常量。數(shù)組在內(nèi)存中是順序存儲(chǔ)的,聲明某個(gè)指針指向數(shù)組中的一個(gè)元素,就可以通過(guò)指針和整數(shù)的加減運(yùn)算(包括增1和減1運(yùn)算)來(lái)訪問(wèn)這個(gè)數(shù)組的每個(gè)元素。由于數(shù)組名本身就是指向數(shù)組第一個(gè)元素的指針常量,因此,可以通過(guò)它來(lái)訪問(wèn)其中的元素?!?/p>

指向數(shù)組元素的指針】

例如: intx[5];數(shù)組名x是指向第一個(gè)元素x[0]的指針,*x表示的就是元素x[0]的值;*(x+2)則是訪問(wèn)x[2]中的值的有效方法?!?/p>

指針與數(shù)組】例6-2訪問(wèn)數(shù)組元素#include<iostream>usingnamespacestd;intmain(){inta[10]={0,1,2,3,4,5,6,7,8,9},i,*p=a;

for(i=0;i<10;i++)cout<<a[i])<<′′;

//利用數(shù)組下標(biāo)輸出數(shù)組元素值,下標(biāo)法

cout<<endl;for(i=0;i<10;i++)cout<<*(a+i)<<′′;

//利用數(shù)組名輸出數(shù)組元素值,指針?lè)?/p>

cout<<endl;for(p=a,p<(a+10);p++)cout<<*p)<<′′;

//利用指針變量輸出數(shù)組元素值return0;}

012345678901234567890123456789利用指針對(duì)數(shù)組進(jìn)行操作時(shí),必須注意越界問(wèn)題。比如: inta[10]; int*p=a;

//指針p指向數(shù)組x的首地址

cout<<*(p+10)*p=5;

數(shù)組是連續(xù)存儲(chǔ)的,通過(guò)對(duì)指向數(shù)組的指針進(jìn)行加減運(yùn)算,使指針指向數(shù)組中不同的元素。p=p+10已經(jīng)使指針p指向的地址在數(shù)組之外,*p=5表達(dá)式在這個(gè)地址中寫(xiě)入值有可能造成嚴(yán)重的后果?!?/p>

用指針變量作函數(shù)形參接受數(shù)組地址】數(shù)組名作函數(shù)參數(shù),傳遞的是數(shù)組首元素的地址用指針變量作函數(shù)形參,也可以接收數(shù)組首元素的地址#include<iostream>usingnamespacestd;intmain(){voidselect_sort(int*p,intn);inta[10],i;cout<<″e(cuò)ntertheoriginalarray:″<<endl;for(i=0;i<10;i++)cin>>a[i];cout<<endl;select_sort(a,10);cout<<″thesortedarray:″<<endl;for(i=0;i<10;i++)cout<<a[i]<<“”;cout<<endl;return0;} 例6-3將10個(gè)整數(shù)按由小到大的順序排列voidselect_sort(int*p,intn)//用指針變量作形參

{inti,j,k,t;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++)if(*(p+j)<*(p+k))k=j;//用指針?lè)ㄔL問(wèn)數(shù)組元素t=*(p+k);*(p+k)=*(p+i);*(p+i)=t;}}entertheoriginalarray:3452168970thesortedarray:0123456789(續(xù))數(shù)組中每個(gè)元素都是一個(gè)指針。它的定義形式如下:

類型名*數(shù)組名[數(shù)組長(zhǎng)度];指針數(shù)組就是元素為指針的數(shù)組。例如:int*p[4];

指數(shù)組中各元素指針?biāo)赶虻念愋?,同一指針?shù)組中各指針元素指向的類型相同。是一個(gè)標(biāo)識(shí)符,是這個(gè)數(shù)組的名字,也即數(shù)組的首地址。【

指針數(shù)組】

不要寫(xiě)成

int(*p)[4];這是指向一維數(shù)組的指針變量注

指針數(shù)組若干字符串按字母順序(從小到大)輸出#include<iostream>usingnamespacestd;intmain(){voidsort(char*name[],intn);

//聲明函數(shù)voidprint(char*name[],intn);char*name[]={“BASIC”,”FORTRAN”,”C++”,”P(pán)ascal”,”COBOL”};intn=5;sort(name,n);print(name,n);return0;}例6-4voidprint(char*name[],intn){inti;for(i=0;i<n;i++)cout<<name[i]<<endl;}BASICCOBOLC++FORTRANPascalvoidsort(char*name[],intn){char*temp;inti,j,k;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++)if(strcmp(name[k],name[j])>0)k=j;if(k!=i){temp=name[i];name[i]=name[k];name[k]=temp;}}}【

字符串與指針】C++中除了可以用字符數(shù)組、字符串變量來(lái)存放字符串外,還可以用字符指針指向一個(gè)字符串#include<iostream>usingnamespacestd;intmain(){char*str=“IloveChina!”cout<<str<<endl;return0;}

例:函數(shù)名是一個(gè)指向函數(shù)首地址的指針常量??梢月暶饕粋€(gè)指向函數(shù)的指針,并使用該指針來(lái)調(diào)用函數(shù)。指向函數(shù)的指針通常簡(jiǎn)稱為函數(shù)指針。聲明的一般形式如下:

函數(shù)類型(*變量名)(函數(shù)形參表);指函數(shù)返回值的類型,形參表中的內(nèi)容應(yīng)與指針?biāo)赶虻暮瘮?shù)的形參表相同?!?/p>

函數(shù)指針】【

函數(shù)與指針】比如:int(*p)(int,int);聲明的函數(shù)指針可以指向一個(gè)函數(shù)的首地址,該函數(shù)的返回值類型和形參表都必須與上述聲明中指定的相同。賦值的一般方法如下:

函數(shù)指針名=函數(shù)名使用函數(shù)指針時(shí),必須先賦值。函數(shù)名所代表的函數(shù)必須是函數(shù)指針可以指向的。聲明了指針p。該指針可以指向返回值為int型,有兩個(gè)int型參數(shù)的函數(shù)。

函數(shù)指針#include<iostream>usingnamespacestd;intmain(){intmax(intx,inty);

//聲明函數(shù)int(*p)(int,int);

//定義指向函數(shù)的指針變量pinta,b,m;p=max;

//使p指向函數(shù)

cin>>a>>b;m=p(a,b);cout<<“max=”<<m<<endl;return0;}intmax(intx,inty){intz;if(x>y)z=x;elsez=y;returnz;} 例6-5當(dāng)一個(gè)函數(shù)的返回值是指針時(shí),通過(guò)返回的指針中存儲(chǔ)的地址值,主調(diào)函數(shù)就能訪問(wèn)相應(yīng)內(nèi)存中存放的數(shù)據(jù),還能通過(guò)指針?biāo)阈g(shù)運(yùn)算訪問(wèn)這個(gè)地址前后內(nèi)存中的值。定義返回指針的函數(shù)的函數(shù)頭一般形式如下:

類型名*函數(shù)名(參數(shù)列表)指針作為函數(shù)返回值的情形,較多地出現(xiàn)在主調(diào)函數(shù)需要訪問(wèn)返回地址前后順序存放的多個(gè)變量時(shí),如數(shù)組、字符串。注是函數(shù)返回的指針?biāo)赶驍?shù)據(jù)的類型。【

返回指針的函數(shù)】指向void類型的指針?lè)Q為void指針。聲明指針時(shí),可以用關(guān)鍵字const進(jìn)行修飾,用關(guān)鍵字const修飾的指針?lè)Q為const指針。比如:inta,b; int*p1=&a,*p2=p1;一般來(lái)說(shuō),只能用指向相同類型的指針給另一個(gè)指針賦值。void指針【

void和const指針】比如:inta;int*p1=&a;double*p2=p1;//錯(cuò)誤比如:inta;

//聲明int型變量int*p1=&a;

//給指針p1賦值void*p2=p1;

//用int型指針直接給void指針賦值,正確int*p3=p2;

//用void指針直接給int型指針賦值,錯(cuò)誤int*p4=(int*)p2;

//void指針通過(guò)強(qiáng)制類型轉(zhuǎn)換給int型指針賦值,

//正確void指針是一個(gè)特例,它可以指向任何類型的C++數(shù)據(jù)。也即可以用任一類型的指針直接給void指針賦值。如果需要將void指針的值賦給其他類型的指針,則需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。語(yǔ)句中的兩個(gè)指針指向的類型不同,因此,它們之間不能相互賦值。除非進(jìn)行強(qiáng)制類型轉(zhuǎn)換。不同類型指針間的賦值是錯(cuò)誤的。void指針#include<iostream>usingnamespacestd;intmain(){inta=1;int*p1=&a,*p2=0;void*pv=p1;

//用int型指針直接給void指針賦值

cout<<″a=\t″<<a<<endl;cout<<″*(int*)pv=\t″<<*(int*)pv<<endl;

//輸出結(jié)果時(shí),void指針必須強(qiáng)制類型轉(zhuǎn)換

p2=(int*)pv;

//給int型指針賦值時(shí),void指針必須轉(zhuǎn)換

cout<<″*p2=\t″<<*p2<<endl;return0;}a=1*(int*)pv=1*pa2=1例

6-61、

指向常量的指針變量程序中不能通過(guò)指針來(lái)改變它所指向的值,但指針本身的值可以改變,即指針可以指向其他數(shù)據(jù)。一般形式為:

const類型名*指針變量名;const指針在用關(guān)鍵字const修飾指針時(shí),關(guān)鍵字const可以放在指針類型前或“*”號(hào)與指針名之間,甚至可以在上述兩個(gè)地方都加。比如: inta=1,b=2; constint*p1=0;

//聲明指向int型常量的指針p1 p1=&a;//將int型變量a的地址賦給指針 *p1=2;//錯(cuò)誤,不能通過(guò)指向常量的指針來(lái)改變它所指的值 a=2//正確,變量的值可通過(guò)變量名改變

p1=&b;//正確,指向常量的指針本身的值可以改變關(guān)鍵字const放在不同的位置表示的意義也不相同。2指針常量(也稱常指針)指針本身的值不可改變,即不能再指向其他數(shù)據(jù),但它指向的數(shù)據(jù)的值可以改變。定義的一般形式為:

類型名*const

指針變量名;

在聲明常指針時(shí)必須初始化(除非它是函數(shù)的形參)。注比如: inta=1,b=2;

int*constp1=&a;

//聲明指向int型常量的指針p1 int*constp2;//錯(cuò)誤,在聲明指針常量時(shí),必須初始化 *p1=2;//正確,指針常量指向的值可以改變

p1=&b;//錯(cuò)誤,指針常量本身的值不可改變3、指向常量的常指針指針本身的值不可改變,它所指向的數(shù)據(jù)的值也不能通過(guò)指針改變。定義的一般形式為:

const

類型名*const指針變量名;

對(duì)于能說(shuō)明為常量的情形,應(yīng)該盡量用關(guān)鍵字const修飾。注比如: inta=10,b=20; constint*constp1=&a;//聲明指向int型常量的常指針p1

*p1=2;//錯(cuò)誤,指針常量指向的值不可改變

p1=&b;//錯(cuò)誤,指針常量本身的值不可改變a=30;//正確,變量的值可通過(guò)變量名改變引用是一個(gè)別名。聲明引用的過(guò)程是為某個(gè)變量建立別名的過(guò)程(也稱某個(gè)變量被引用)。在聲明引用時(shí)需要同時(shí)初始化其聲明的一般形式如下:

數(shù)據(jù)類型&引用名=變量名; 或 數(shù)據(jù)類型&引用名(變量名);比如:inta; int&ra=a;被引用的變量可以是任一類型的變量。ra是為整數(shù)a的引用變量名是被引用變量的名字“&”是引用運(yùn)算符指被引用變量的類型【

引用】

引用#include<iostream.h>intmain(){inta=0;int&ra=a;cout<<″a=″<<a<<endl;cout<<″ra=″<<ra<<endl;ra=2;cout<<″a=″<<a<<endl;cout<<″ra=″<<ra<<endl;cout<<″&a=″<<&a<<endl;cout<<″&ra=″<<&ra<<endl;return0;}為一個(gè)變量聲明了引用之后,引用就成了這個(gè)變量的別名。最后兩條語(yǔ)句是輸出變量的地址,語(yǔ)句中的“&”號(hào)是取地址運(yùn)算符。例6-7a=0ra=0a=2ra=2&a=0x0065FDF4&ra=0x0065FDF4求引用的地址,實(shí)際上返回的是被引用變量的地址。

引用初始化后其值不能改變,即不允許把為一個(gè)變量建立的引用重新用作另一變量的別名。程序中,對(duì)引用重新賦值的意義是給被引用變量賦新值。不能建立引用數(shù)組。不能建立引用的引用。要注意區(qū)別引用聲明符&和地址運(yùn)算符&。注(續(xù))之前介紹過(guò)的函數(shù)參數(shù)傳遞方式有兩種:

(1)將變量名作為實(shí)參和形參;

(2)形參是指針變量,實(shí)參是變量的地址。這兩種方式都可以看作“值傳遞”方式以引用作形參的調(diào)用,實(shí)參是變量名,稱為引用調(diào)用。【

把引用用作函數(shù)參數(shù)】例6-8要求將變量i和j的值互換實(shí)參、形參為變量名#include<iostream>usingnamespacestd;intmain(void){voidswap(int,int);

//函數(shù)聲明inti=3,j=5;swap(i,j);//實(shí)參為變量名cout<<″i=″<<i<<′\t′<<″j=″<<j<<endl;//i

和j的值未互換return0;}

voidswap(inta,intb)//形參為變量名{inttemp;temp=a;a=b;b=temp;}

x=3y=5例6-8形參為指針,實(shí)參為地址#include<iostream>usingnamespacestd;intmain(void){voidswap(int*,int*);//函數(shù)聲明inti=3,j=5;swap(&i,&j);//實(shí)參為變量名地址cout<<″i=″<<i<<′\t′<<″j=″<<j<<endl;//i和j的值互換return0;}

voidswap(int*p1,int*p2)//形參為指針{inttemp;temp=*p1;*p1=*p2;*p1=temp;}

x=5y=3例6-8形參為引用,實(shí)參為變量名(引用調(diào)用)#include<iostream>usingnamespacestd;intmain(void){voidswap(int&,int&);

//函數(shù)聲明inti=3,j=5;swap(i,j);//實(shí)參為變量名cout<<″i=″<<i<<′\t′<<″j=″<<j<<endl;//i和j的值互換return0;}

voidswap(int&a,int&b)//形參為引用{inttemp;temp=a;a=b;b=temp;} x=5y=3函數(shù)可以返回引用,必須注意,引用只是一個(gè)別名,絕對(duì)不能返回不在作用域內(nèi)的對(duì)象的引用。例6-9

返回引用#include<iostream>usingnamespacestd;int&fun(int&i);intmain(){inta;cout<<fun(a)<<endl;return0;}int&fun(int&i){i=2;returni;}2【

返回引用的函數(shù)】2.利用引用調(diào)用提高程序的效率采用傳址或引用調(diào)用,函數(shù)中傳遞的是對(duì)象的地址,不需要為對(duì)象臨時(shí)建立一個(gè)副本,程序的效率將會(huì)提高。指針與引用的不同:(1)引用不可以是空引用。如果對(duì)象有可能為空時(shí),就必須采用指針。(2)引用本身不能重新賦值。如果程序需要先指向一個(gè)對(duì)象,后又指向另一對(duì)象,也應(yīng)該采用指針。例6-10

空引用#include<iostream>#include<stdlib>usingnamespacestd;int&fun();intmain(){int&rp=fun();int*p=&rp;cout<<rp;deletep;

//釋放內(nèi)存后,引用rp是一個(gè)空引用

return0;}

上例能編譯運(yùn)行。但它確實(shí)出現(xiàn)了空引用,這是不對(duì)的。(續(xù))int&fun(){int*p=newint;if(p==0){cout<<"內(nèi)存分配錯(cuò)誤"<<endl; exit(1); //系統(tǒng)函數(shù),用于終止程序的運(yùn)行

}int&rp=*p;rp=5;returnrp;}第7章自定義數(shù)據(jù)類型本章介紹自定義數(shù)據(jù)類型:結(jié)構(gòu)體、共用體、枚舉的定義及使用;討論new和delete的使用及typedef的應(yīng)用。

除了數(shù)組,用戶可以自己聲明的類型還有:結(jié)構(gòu)體(structure)類型共用體(union)類型枚舉(enumeration)類型類(class)類型【

結(jié)構(gòu)體類型】【結(jié)構(gòu)體類型變量的定義及引用】☆將不同類型的數(shù)據(jù)組合成一個(gè)有機(jī)的整體,C++語(yǔ)言提供了一種數(shù)據(jù)結(jié)構(gòu),稱為結(jié)構(gòu)體。例:

structStudent{ intnum;//學(xué)號(hào)

charname[20];//姓名 charsex;//性別

int//年齡};struct結(jié)構(gòu)體類型名{成員表列};//注意分號(hào)不要遺漏例:

structStudent{ intnum;//類型名成員名; charname[20]; intage;};1、結(jié)構(gòu)體類型聲明方式結(jié)構(gòu)體類型可全局聲明,也可局部聲明。結(jié)構(gòu)體類型名2、結(jié)構(gòu)體類型變量的定義使用結(jié)構(gòu)體時(shí),不能使用結(jié)構(gòu)體類型名,只能使用結(jié)構(gòu)體變量。定義結(jié)構(gòu)體變量有三種方法。方法1:先聲明結(jié)構(gòu)體類型,再定義變量。方法2:聲明結(jié)構(gòu)體類型的同時(shí),定義變量。方法3:直接定義結(jié)構(gòu)體類型變量。系統(tǒng)根據(jù)變量定義,分配內(nèi)存空間。方法2:聲明的同時(shí)定義變量例:

structStudent{intnum;charname[20];}student1,s2,s3;方法3:直接定義變量(不可取)例:

struct{ intnum; charname[20];}student1,s2,s3;C++中,聲明結(jié)構(gòu)體類型時(shí)可以不加關(guān)鍵字struct,而C一定要加注方法1:先聲明結(jié)構(gòu)體類型,再定義變量。(最可取)例:structStudent//24B{ intnum; charname[20];};Studentstudent1,student2;☆其他說(shuō)明(1)不是結(jié)構(gòu)體類型都有相同的結(jié)構(gòu)。例:structStudent//24B{ intnum; charname[20];};structStudent1//8B{ intnum; intage;};(2)類型與變量不同①使用變量,不能使用類型。②編譯時(shí),僅對(duì)變量分配內(nèi)存。(3)成員的引用相當(dāng)普通的變量(.成員運(yùn)算符)例:structS{ intnum; charname[20];}s1,s2;使用:

s1.num=20;strcpy(,"LiMing");s2.num=21;strcpy(,"ZhangHua");(4)成員也可是結(jié)構(gòu)體變量例:structDate{ intmonth; intday; intyear;

};structStudent{ intnum; charname[20]; charsex; intage; Datebirthday;charaddr[30];}student1,student2;3、結(jié)構(gòu)體類型變量的初始化定義時(shí)指定初始值例:structStudent{ intnum; charname[20]; charsex; intage; floatscore; charaddr[30];}student1={10001,"ZhangXin",'M',19,90.5,"Shanghai"};例:student1.num=10010;4、結(jié)構(gòu)體類型變量的引用1)可以將一個(gè)結(jié)構(gòu)體變量的值賦給另一個(gè)具有相同結(jié)構(gòu)的結(jié)構(gòu)體變量。例:student1=student2;2)可以引用一個(gè)結(jié)構(gòu)體變量中的一個(gè)成員的值。引用結(jié)構(gòu)體變量中成員的一般方式為:結(jié)構(gòu)體變量名.成員名(.優(yōu)先級(jí)高,自左向右)3)如果成員本身也是一個(gè)結(jié)構(gòu)體類型,則要用若干個(gè)成員運(yùn)算符,一級(jí)一級(jí)地找到最低一級(jí)的成員。4)不能將一個(gè)結(jié)構(gòu)體變量作為一個(gè)整體進(jìn)行輸入和輸出。只能對(duì)結(jié)構(gòu)體變量中的各個(gè)成員分別進(jìn)行輸入和輸出。例:

cin>>student1.num;cout>>student1.num;5)對(duì)結(jié)構(gòu)體變量的成員可以像普通變量一樣進(jìn)行各種運(yùn)算(根據(jù)其類型決定可以進(jìn)行的運(yùn)算種類)。例:sum=student1.score+student2.score;student1.age++;由于"."運(yùn)算符的優(yōu)先級(jí)高,因此student1.age++相當(dāng)于(student1.age)++。注【

結(jié)構(gòu)體數(shù)組】定義結(jié)構(gòu)體數(shù)組的目的:

(一個(gè)結(jié)構(gòu)體變量只能存一組數(shù)據(jù)。如:一個(gè)學(xué)生的檔案,一個(gè)日期。)定義結(jié)構(gòu)體數(shù)組,可有多個(gè)元素,就可存放多個(gè)學(xué)生的檔案,多個(gè)日期。與定義結(jié)構(gòu)體變量的方法一樣,只須指出其為數(shù)組即可如:structStudent{ intnum; charname[20]; floatscore;};Studentstu[3];例:structStudent{ intnum; charname[20]; charsex; intage; floatscore; charaddr[30];}stu[3]={{10101,"LiLin",'M',18,87.5,"103BeijingRoad"},{10102,"ZhangFun",'M',19,99,"130ShanghaiRoad"},{10104,"WangMin",'F',20,78.5,"1010,ZhongshanRoad"}};結(jié)構(gòu)體數(shù)組的初始化//對(duì)候選人得票的統(tǒng)計(jì)程序#include<iostream>usingnamespacestd;structPerson{ charname[20]; intcount;};intmain(){Personleader[3]={"Li",0,"Zhang",0,"Fun",0};inti,j;for(i=0;i<10;i++){cin>>leader_name;

for(j=0;j<3;j++) if(strcmp(leader_name,leader[j].name)==0)leader[j].count++;}

for(i=0;i<3;i++)

cout<<leader[i].name<<":”<<leader[i].count<<endl;

return0;}例7-1結(jié)構(gòu)體數(shù)組輸入:ZhangLiSunLiZhangLi輸出:Li:3Zhang:2Sun:1修改程序:(用字符串變量)全局結(jié)構(gòu)體類型聲明:

structPerson{

stringname;

intcount;};定義結(jié)構(gòu)體變量,但不能初始化:

Personleader[3];

for(i=0;i<3;i++){ cin>>leader[i].name;

leader[i].count=0;}

stringleader_name;統(tǒng)計(jì)得票:

for(i=0;i<10;i++){cin>>leader_name;for(j=0;j<3;j++)

if(leader_name==leader[j].name)

leader[j].count++;}1)指向結(jié)構(gòu)體變量指針變量的定義前提:需聲明結(jié)構(gòu)體類型例:structStudent{longnum;charname[20];};定義:結(jié)構(gòu)體類型名*變量名;例:Student*p;【

指向結(jié)構(gòu)體變量的指針】1、通過(guò)指向結(jié)構(gòu)體變量的指針引用結(jié)構(gòu)體變量中的成員2)賦初值

Studentstudent1;Student*p;p=&student1;(指向確定)3)引用成員

student1.num=98001(*p).num=98001注意:括號(hào)不能省略。4)指向運(yùn)算符->

(*p).num=98001可改寫(xiě)為p->num=98001優(yōu)先級(jí)最高級(jí)結(jié)合性自左向右

p->num(可看成一個(gè)整體)p->num++++p->num結(jié)構(gòu)體成員的三種表示方法直接訪問(wèn):student1.num

間接訪問(wèn):(*p).nump->num2、用結(jié)構(gòu)體變量和指向結(jié)構(gòu)體變量的指針構(gòu)成鏈表鏈表是一種常見(jiàn)的重要的數(shù)據(jù)結(jié)構(gòu)。鏈表有一個(gè)"頭指針"變量,圖中以head表示,它存放一個(gè)地址。該地址指向第一個(gè)元素。鏈表中的每一個(gè)元素稱為"結(jié)點(diǎn)"。每個(gè)結(jié)點(diǎn)都應(yīng)包括兩個(gè)部分:一是用戶需要用的實(shí)際數(shù)據(jù),二是下一個(gè)結(jié)點(diǎn)的地址。鏈表結(jié)點(diǎn)的結(jié)構(gòu)體類型:

structStudent{longnum;floatscore;Student*next;};鏈表的表頭:

Student*head;

Part1

Part2

NULL【

結(jié)構(gòu)體類型數(shù)據(jù)作為函數(shù)參數(shù)】

將一個(gè)結(jié)構(gòu)體變量中的數(shù)據(jù)傳遞給另一個(gè)函數(shù),有下列3種方法:用結(jié)構(gòu)體變量名作參數(shù)。一般較少用這種方法。

(傳值調(diào)用,單向,不共占內(nèi)存)(2)用指向結(jié)構(gòu)體變量的指針作實(shí)參,將結(jié)構(gòu)體變量的地址傳給形參。(傳址調(diào)用)(3)用結(jié)構(gòu)體變量的引用(別名)作函數(shù)參數(shù)。

(傳址調(diào)用)(最可取)例7.2有一個(gè)結(jié)構(gòu)體變量stu,內(nèi)含學(xué)生學(xué)號(hào)、姓名和3門(mén)課的成績(jī)。要求在main函數(shù)中為各成員賦值,在另一函數(shù)print中將它們的值輸出。函數(shù)聲明:voidprint(Student);函數(shù)調(diào)用:print(stu);函數(shù)定義:voidprint(Studentstu){ cout<<stu.num……;}實(shí)參stu和形參stu各占內(nèi)存。傳遞的是整個(gè)結(jié)構(gòu)體成員值用結(jié)構(gòu)體變量作函數(shù)參數(shù)函數(shù)聲明:voidprint(Student*);函數(shù)調(diào)用:print(&stu);

或Student*pt;pt=&stu;print(pt);函數(shù)定義:voidprint(Student*p){ cout<<p->num……;}形參p指向?qū)崊tu。傳遞的是結(jié)構(gòu)體變量stu首地址。(2)

用指向結(jié)構(gòu)體變量的指針作形參函數(shù)聲明:voidprint(Student&);函數(shù)調(diào)用:print(stu);函數(shù)定義:voidprint(Student&stud){ cout<<stud.num……;}形參stud是實(shí)參stu的別名,共占內(nèi)存。傳遞的是結(jié)構(gòu)體的首地址。(3)用結(jié)構(gòu)體變量的引用(別名)作函數(shù)參數(shù)在軟件開(kāi)發(fā)過(guò)程中,常常需要?jiǎng)討B(tài)地分配和撤銷內(nèi)存空間,例如對(duì)動(dòng)態(tài)鏈表中結(jié)點(diǎn)的插入與刪除。C++提供了較簡(jiǎn)便而功能較強(qiáng)的運(yùn)算符new和delete。

new:動(dòng)態(tài)分配內(nèi)存空間delete:撤銷(釋放)內(nèi)存空間【

new和delete運(yùn)算符】new和delete是運(yùn)算符。C語(yǔ)言中malloc()和free()是函數(shù)注1、new運(yùn)算符1)用new分配數(shù)組空間時(shí)不能指定初值。2)如果由于內(nèi)存不足等原因而無(wú)法正常分配空間,則new會(huì)返回一個(gè)空指針NULL,用戶可以根據(jù)該指針的值判斷分配空間是否成功。注一般格式為:

new類型[(初值)]

(該中括號(hào)表示可選項(xiàng))例:newint;作用:開(kāi)辟一個(gè)存放整數(shù)的存儲(chǔ)空間,返回一個(gè)指向該存儲(chǔ)空間的地址(即指針)。例:newint(100);作用:開(kāi)辟一個(gè)存放整數(shù)的空間,并指定該整數(shù)的初值為100,返回一個(gè)指向該存儲(chǔ)空間的地址。

(注意:沒(méi)有賦給變量,下面的例子也是如此)例:newchar[10];作用:開(kāi)辟一個(gè)存放字符數(shù)組(包括10個(gè)元素)的空間,返回首元素的地址。

例:newint[5][4];作用:開(kāi)辟一個(gè)存放二維整型數(shù)組(大小為5*4)的空間,返回首元素的地址。例:loat*p=newfloat(3.14159);作用:開(kāi)辟一個(gè)存放單精度數(shù)的空間,并指定該實(shí)數(shù)的初值為3.14159,將返回的該空間的地址賦給指針變量p。

一般格式為

delete指針變量(對(duì)變量)

或delete[]指針變量(對(duì)數(shù)組)1)前提:必須有指針變量指向new開(kāi)辟的內(nèi)存空間,才可用delete釋放。例:newint;開(kāi)辟了,卻不能釋放。2)注意:此處中括號(hào)為釋放動(dòng)態(tài)數(shù)組空間需要的。例:float*p=newfloat(3.14159);deletep;作用:釋放上面用new開(kāi)辟的存放單精度數(shù)的空間。例:char*pt=newchar[10];delete[]pt;作用:在指針變量前面加一對(duì)方括號(hào),表示是對(duì)數(shù)組空間的釋放操作。2、delete運(yùn)算符//臨時(shí)開(kāi)辟一個(gè)存儲(chǔ)空間存放一個(gè)結(jié)構(gòu)體數(shù)組#include<iostream>#include<string>usingnamespacestd;structStudent{ stringname; intnum;charsex;};intmain(){Student*p;p=newStudent;p->name=“wangfang”;p->num=10123;p->sex=‘m’;cout<<p->name<<endl<<p->num<<endl<<p->sex<<endl;deletep;

return0;}例7-3動(dòng)態(tài)分配內(nèi)存輸出:wangfang10123m【

共用體】☆有時(shí)需要使幾種不同類型的變量存放到同一段內(nèi)存單元中。這種使幾個(gè)不同的變量共占同一段內(nèi)存的結(jié)構(gòu),稱為共用體(union)類型聲明共用體類型的一般形式

溫馨提示

  • 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)論