C++語(yǔ)言-南開大學(xué)ch6-1第 6章 指針、結(jié)構(gòu)體及引用_第1頁(yè)
C++語(yǔ)言-南開大學(xué)ch6-1第 6章 指針、結(jié)構(gòu)體及引用_第2頁(yè)
C++語(yǔ)言-南開大學(xué)ch6-1第 6章 指針、結(jié)構(gòu)體及引用_第3頁(yè)
C++語(yǔ)言-南開大學(xué)ch6-1第 6章 指針、結(jié)構(gòu)體及引用_第4頁(yè)
C++語(yǔ)言-南開大學(xué)ch6-1第 6章 指針、結(jié)構(gòu)體及引用_第5頁(yè)
已閱讀5頁(yè),還剩45頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第6章指針、結(jié)構(gòu)體及引用6.1指針類型6.2指針變量的操作(運(yùn)算)6.3指針運(yùn)算實(shí)例6.4數(shù)組或指針作為函數(shù)參數(shù)6.5指針與內(nèi)存動(dòng)態(tài)分配6.6指針與數(shù)組6.7選擇排序算法6.8按字典序排列名表6.9結(jié)構(gòu)體類型6.10建立一個(gè)人員檔案鏈表6.11指向函數(shù)的指針變量6.12返回指針值的函數(shù)6.13帶參數(shù)的main函數(shù)6.14引用

16.1指針類型

--參看書p138的6.2.1小節(jié)指針類型的變量說明格式為:<類型名>*<指針變量名1>,*<指針變量名2>,...;

例如:

inti=3;

int*pi;//pi為int*型變量,其取值為一個(gè)int型變量的地址,//也稱pi為指向int型數(shù)據(jù)的指針變量(簡(jiǎn)稱指針)

2

pi=&i; //&作單目算符時(shí)為“取變量地址”, //此處將變量i的地址賦給指針變量picout<<*pi; //輸出:*pi之值即3 //“*”作單目算符時(shí)為“取內(nèi)容” //(取指針?biāo)赶虻哪且蛔兞康膬?nèi)容)*pi=123; //給pi所指向的那一變量,既i,

//賦值123(等同于:i=123;)3

讀如下程序,看執(zhí)行后會(huì)顯示出什么結(jié)果?#include<iostream.h>voidmain(){

inti,j; int*pi,*pj; i=3; j=6; pi=&i; pj=&j;

cout<<"i,j="<<i<<","<<j<<endl;

cout<<"*pi,*pj="<<*pi<<","<<*pj<<endl; *pi=123; *pj=*pi+2;

cout<<"*pi,*pj="<<*pi<<","<<*pj<<endl;

cout<<"i,j="<<i<<","<<j<<endl;}

4

程序執(zhí)行后的顯示結(jié)果如下:i,j=3,6*pi,*pj=3,6*pi,*pj=123,125i,j=123,12556.2指針變量的操作(運(yùn)算)

--參看書p140的6.2.2小節(jié)

1.取地址運(yùn)算&和取內(nèi)容運(yùn)算*

注意如下3處出現(xiàn)的*pi,它們的含義不相同:

inti=23,*pi=&i;

cout<<*pi;*pi=56;6

第一行的“*pi”處于變量說明處,是說明pi為“int*”型變量,并同時(shí)將該指針變量初始化為i的地址。不可將此處的“*”理解為“取內(nèi)容”運(yùn)算,它與前面的int聯(lián)合起來(lái)以說明pi為“int*”型變量。

第二行的“*pi”表示指針變量pi所指向的那一變量(即i)的內(nèi)容(*理解為“取內(nèi)容”運(yùn)算,使用其值)。

第三行的“*pi”為左值(存儲(chǔ)空間概念),表示要改變指針變量pi所指向的那一變量(即i)空間中的內(nèi)容(使用其存儲(chǔ)空間)。72.數(shù)組指針的算術(shù)運(yùn)算

1)若p為指針,已指向數(shù)組的某一元素,則p+i(或p-i,其中i為正整數(shù))也為一指針,它指向當(dāng)前p已指元素的后面(或前面)第i個(gè)元素。

例1:

inta[10]; //任一數(shù)組名字a都是一個(gè)常量指針, //代表數(shù)組的首地址,也即,a總等同于&a[0]8

則,無(wú)論何時(shí),下述兩種表示數(shù)組元素a[i]的方式總是相同的:

a[0]<==>*a a[1]<==>*(a+1) ... a[9]<==>*(a+9)

另,下述兩種表示數(shù)組元素a[i]之地址的方式也總是相同的:

&a[0]<==>a &a[1]<==>a+1 ... &a[9]<==>a+9

9

例2:

inta[10]; int*pa=a;//pa為變量指針,此時(shí)pa與a

//均指向數(shù)組a的首元素

則,下述三種表示數(shù)組元素a[i]的方式是等同的:

a[0]<==>*a<==>*pa a[1]<==>*(a+1)<==>*(pa+1) ... a[9]<==>*(a+9)<==>*(pa+9)

10

另,下述三種表示數(shù)組元素a[i]之地址的方式也是等同的:

&a[0]<==>a<==>pa &a[1]<==>a+1<==>pa+1 ... &a[9]<==>a+9<==>pa+9

而pa+=3;及pa--;也都為正確的句子(但,a+=3;及a--;卻都是不正確的句子!為什么?)。

11

2)

若p,q都為同類型的指針,則p-q為p與q之間的數(shù)據(jù)項(xiàng)數(shù)(當(dāng)p,q指向同一數(shù)組時(shí),結(jié)果有意義)。

3.數(shù)組指針的關(guān)系運(yùn)算

若p,q都為同類型的指針,則p與q間可進(jìn)行6種比較運(yùn)算(通常用于p,q指向同一數(shù)組的情況,靠前者其指針值小)。

126.3指針運(yùn)算實(shí)例

編程序,首先輸入5個(gè)整數(shù)放入數(shù)組a,而后按輸入的相反順序輸出這5個(gè)數(shù)。

1.常量指針使用方式

解法一(通過數(shù)組名a,一個(gè)常量指針來(lái)實(shí)現(xiàn))#include<iostream.h>voidmain(){

inti,a[5];

cout<<"input5integers:"<<endl;

13

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

cin>>*(a+i); //*(a+i)全同于a[i], //a為數(shù)組首地址(一個(gè)常量指針)

cout<<"====Reverseoutput:===="<<endl; for(i=4;i>=0;i--)

cout<<*(a+i)<<"";

cout<<endl;} 14

2.變量指針使用方式

解法二(通過指針變量p值的變化,使其指向數(shù)組各元素并依次使用它們)

#include<iostream.h>voidmain(){

inti,a[5],*p; //指針變量p

cout<<"input5integers:"<<endl;15for(i=0;i<5;i++)

cin>>*(a+i);

cout<<"====Reverseoutput:===="<<endl;for(p=a+4;p>=a;p--)

cout<<*p<<""; //*p指向各不同a[i]

cout<<endl;} //循環(huán)過程中p值總在變化(通過指針加減運(yùn)算),//p>=a為指針比較運(yùn)算16

6.4數(shù)組或指針作為函數(shù)參數(shù)

6.4.1數(shù)組作為函數(shù)參數(shù) 6.4.2指針作為函數(shù)參數(shù)例1 6.4.3指針作為函數(shù)參數(shù)例2

17

例:inta=5;

定義整型變量a有兩個(gè)值:

1、該變量?jī)?nèi)容5;

2、該變量在內(nèi)存中的地址;它被表示為&a。int*pa=&a;

用*定義的整型指針變量pa也有兩個(gè)值:

1、內(nèi)容為變量a在內(nèi)存中的地址,即&a;

2、變量pa在內(nèi)存中的地址;它被表示為&pa。

3、pa是一個(gè)指向變量a的指針。

變量a

與指針pa的關(guān)系圖內(nèi)容地址a51000Hpa10002000H186.4.1數(shù)組作為函數(shù)參數(shù)通過指針(如數(shù)組名,或其它指針)作為函數(shù)參數(shù),可起到如同引用參數(shù)那樣的能“雙向傳遞”數(shù)據(jù)的功能。

用法一:數(shù)組作形參,且在被調(diào)函數(shù)內(nèi)使用或改變數(shù)組元素的值(已在5.7節(jié)介紹過,系統(tǒng)處理方法--對(duì)形參數(shù)組元素的使用與改變,就是對(duì)實(shí)參數(shù)組元素的直接使用與改變)。

讀如下程序,看執(zhí)行后會(huì)顯示出什么結(jié)果?19#include<iostream.h>voidmyFunc(intb[],intnum);voidmain(){

inta[6]={1,2,3,4,5,6};

cout<<"beforecalling'muFunc'a[i]="<<endl;

for(inti=0;i<6;i++)

cout<<a[i]<<"";

cout<<endl; myFunc(a,6);//數(shù)組名a(一個(gè)常量指針)作實(shí)參

cout<<endl<<"aftercalling'muFunc'a[i]="<<endl;20

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

cout<<a[i]<<"";//輸出被myFunc改變后的a數(shù)組各元素值(每一數(shù)都加了100)

cout<<endl;}//main結(jié)束voidmyFunc(intb[],intnum){

intsum=0;

for(inti=0;i<num;i++) sum+=b[i];

cout<<endl<<"inmyFunc,sumofb[i]="<<sum<<endl; for(i=0;i<num;i++) b[i]+=100;}

21

程序執(zhí)行后的顯示結(jié)果如下:beforecalling'muFunc'a[i]=123456

inmyFunc,sumofb[i]=21

aftercalling'muFunc'a[i]=101102103104105106226.4.2指針作為函數(shù)參數(shù)例1

--參看書p146的6.2.5小節(jié)的1

通過指針(如數(shù)組名,或其它指針)作為函數(shù)參數(shù),可起到如同引用參數(shù)那樣的能“雙向傳遞”數(shù)據(jù)的功能。

用法二:指針作形參,且在被調(diào)函數(shù)內(nèi)使用或改變指針?biāo)缸兞康闹?系統(tǒng)處理方法--對(duì)形參指針?biāo)缸兞恐档氖褂门c改變,就是對(duì)實(shí)參指針?biāo)缸兞恐档闹苯邮褂门c改變)

讀如下程序,看執(zhí)行后會(huì)顯示出什么結(jié)果?23

#include<iostream.h>voidmyFunc(int*p,intnum);voidmain(){

inta[6]={1,2,3,4,5,6};

int*pa=a;

cout<<"beforecalling'muFunc'*(pa+i)="<<endl;

for(inti=0;i<6;i++)

cout<<*(pa+i)<<"";

cout<<endl; myFunc(pa,6); //指針pa作為實(shí)參去調(diào)用自定義函數(shù)muFunc

cout<<endl<<"aftercalling'muFunc'*(pa+i)="<<endl;24for(i=0;i<6;i++)

cout<<*(pa+i)<<""; //輸出被myFunc改變后以pa為首地址的 //各元素值(每一數(shù)都加了100)

cout<<endl;}voidmyFunc(int*p,intnum){

intsum=0;

for(inti=0;i<num;i++) sum+=*(p+i);

cout<<endl<<"inmyFunc,sumof*(p+i)="<<sum<<endl; for(i=0;i<num;i++) *(p+i)+=100;}25程序執(zhí)行后的顯示結(jié)果如下:beforecalling'muFunc'a[i]=123456

inmyFunc,sumofb[i]=21

aftercalling'muFunc'a[i]=101102103104105106266.4.3指針作為函數(shù)參數(shù)例2

--參看書p146的6.2.5小節(jié)的1

讀下面的程序,給出它執(zhí)行后所顯示的結(jié)果。

27#include<iostream.h>voidswap1(int*p1,int*p2); //指針參數(shù)voidswap12(int*p1,int*p2); //指針參數(shù)voidswap2(int&a,int&b); //引用參數(shù)voidswap3(intx,inty); //賦值參數(shù)

voidmain(){

intb1=11,b2=22;

cout<<"beforswap1=>b1,b2="<<b1<<""<<b2<<endl; swap1(&b1,&b2);

cout<<"afterswap1=>b1,b2="<<b1<<""<<b2<<"\n\n";

28

b1=11,b2=22;

cout<<"beforswap12=>b1,b2="<<b1<<""<<b2<<endl; swap12(&b1,&b2);

cout<<"afterswap12=>b1,b2="<<b1<<""<<b2<<"\n\n";

intc1=33,c2=44;

cout<<"beforswap2=>c1,c2="<<c1<<""<<c2<<endl; swap2(c1,c2);

cout<<"afterswap2=>c1,c2="<<c1<<""<<c2<<"\n\n";

29

intd1=55,d2=66;

cout<<"beforswap3=>d1,d2="<<d1<<""<<d2<<endl; swap3(d1,d2);

cout<<"afterswap3=>d1,d2="<<d1<<""<<d2<<"\n\n";}

voidswap1(int*p1,int*p2){ //交換指針?biāo)缸兞康闹?/p>

inttemp; temp=*p1; *p1=*p2; *p2=temp;}30voidswap12(int*p1,int*p2){//交換二形參指針“局部空間”中的值

int*temp; temp=p1; p1=p2; p2=temp;}

voidswap2(int&a,int&b){//交換引用變量的值

inttemp; temp=a; a=b; b=temp;}31

voidswap3(intx,inty){ //交換賦值參數(shù)“局部空間”中的值

inttemp; temp=x; x=y; y=temp;}32

程序執(zhí)行后的顯示結(jié)果如下:beforswap1=>b1,b2=1122afterswap1=>b1,b2=2211

beforswap12=>b1,b2=1122afterswap12=>b1,b2=1122

beforswap2=>c1,c2=3344afterswap2=>c1,c2=4433

beforswap3=>d1,d2=5566afterswap3=>d1,d2=5566336.5指針與內(nèi)存動(dòng)態(tài)分配

--參看書p148的6.3節(jié)

通過使用new與delete單目運(yùn)算符來(lái)實(shí)現(xiàn)動(dòng)態(tài)變量的分配與撤消。

1)new

使用格式:

new<類型名> //動(dòng)態(tài)變量

new<類型名>(<初值>)

new<類型名>[<元素個(gè)數(shù)>]//動(dòng)態(tài)數(shù)組

功能:生成一個(gè)(或一批)所給類型的無(wú)名動(dòng)態(tài)變量,返回所生成變量的一個(gè)指針值(首地址)。34

例:

int*pi,*pj,a=10; char*pc; pi=newint; *pi=a*a; pc=newchar('A');

pj=newint[10];

35

2)delete

使用格式:

delete<指針>

delete[]<指針>

功能: 釋放通過new生成的動(dòng)態(tài)變量(或動(dòng)態(tài)數(shù)組),但指針變量仍存在。36

例:

int*pi,*pj; pi=newint;

pj=newint[10]; ... deletepi; //釋放動(dòng)態(tài)變量*pi,但指針變量pi仍存在

delete[]pj;373)使用示例

從鍵盤輸入10個(gè)int型數(shù),而后按輸入的相反順序輸出它們。要求使用new運(yùn)算符動(dòng)態(tài)申請(qǐng)數(shù)據(jù)空間存放數(shù)據(jù)。

使程序執(zhí)行后的輸入輸出界面為:Input10integers:12345678910----Theresult----1098765432138#include<iostream.h>voidmain(){

inti,*a,*p; a=newint[10];

cout<<"input10integers:"<<endl; for(i=0;i<10;i++)

cin>>*(a+i); //也可用a[i]

cout<<"----Theresult----"<<endl; for(p=a+9;p>=a;p--)

cout<<*p<<"";

cout<<endl;}

396.6指針與數(shù)組

--參看書p142的6.2.3小節(jié)

1.分量為指針的數(shù)組 --參看書p143的6.2.3小節(jié)的3

其說明格式為(一維數(shù)組時(shí)):

<類型名>*<數(shù)組名>[<元素個(gè)數(shù)>] (多維時(shí),將指定多個(gè)方括號(hào)括起的<元素個(gè)數(shù)>)40例1:

intw,x,y,z,A[2][10];

int*p1[4]={&w,&x,&y,&z};//p1數(shù)組的4個(gè)分量均為int*型指針(變量)

int*p2[2]={A[0],A[1]}; //A[0]表示A數(shù)組的第一行,為含有10個(gè)元素的 //一維數(shù)組(的數(shù)組名),表示一個(gè)常量地址。41

例2:

char*name[5]={"Zhaolin","Mazhigang","Liguoping","Sunyingmin","Mazilan"};//每一分量name[i]均為“char*”類型的//指針(變量),從而均可被賦予一個(gè)字符串值。422.指向數(shù)組的指針

--參看書p142的6.2.3小節(jié)的2

把數(shù)組作為整體,指向這樣一個(gè)整體的指針被稱為指向數(shù)組的指針。其說明格式如下:

<類型名>(*<指針變量名>)[<元素個(gè)數(shù)>]

43

例:int(*pa)[4]; //pa為指針,指向一維數(shù)組,數(shù)組含4個(gè)int型分量。 //可理解為*pa為具有4個(gè)int型分量的一維數(shù)組名

intA[3][4]={{11,12,13,14},{21,22,23,24}, {31,32,33,34}};pa=A; //pa指向A數(shù)組的第一行

44

cout<<(*pa)[0]<<""<<(*pa)[1]<<""<<(*pa)[2] <<""<<(*pa)[3]<<endl; //輸出第一行4元素

pa++; //一步向后“邁過”pa所指向的那一個(gè)一維數(shù)組 //的整體大小,使pa指向A數(shù)組的第二行

cout<<(*pa)[0]<<""<<(*pa)[1]<<""<<(*pa)[2] <<""<<(*pa)[3]<<endl; //輸出第二行4元素45

3.指向指針的指針

(多重指針,間接再間接)例:

intx,*p,**q; //q為指向指針的指針

x=123; p=&x; q=&p;

cout<<"x="<<x<<endl;

cout<<"*p="<<*p<<endl;

cout<<"**q="<<**q<<endl; //x,*p,**q之值均為12346

int**a; a=newint*[3]; //a為指針,指向具有3個(gè)“int*”數(shù)據(jù) //的數(shù)組(即元素均為指針的數(shù)組)

for(i=0;i<3;i++) *(a+i)=newint[4];

/*

分配3批動(dòng)態(tài)空間(每批為4個(gè)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論