五邑大學(xué)《程序設(shè)計原理》第6章_第1頁
五邑大學(xué)《程序設(shè)計原理》第6章_第2頁
五邑大學(xué)《程序設(shè)計原理》第6章_第3頁
五邑大學(xué)《程序設(shè)計原理》第6章_第4頁
五邑大學(xué)《程序設(shè)計原理》第6章_第5頁
已閱讀5頁,還剩65頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第6章

指針6.1指針的概念存儲器存儲單元存儲器存儲器----->存儲單元----->存儲單元的地址對應(yīng)于:文件柜-->文件柜上的抽屜-->抽屜上的編號存儲單元地址200020012002在內(nèi)存中如何存儲數(shù)據(jù)、訪問數(shù)據(jù)?200020042008int

main(){int

i,j,k;cin>>i>>j;cout<<i<<’

’<<j;k=i+j;cout<<k;}變量i變量j變量k369i:2000j:2004k:2008變量與地址對照表假設(shè)鍵盤輸入3和6,則3存在i中,其實(shí)是將3送到地址為2000開始的單元中存儲。6存在j中,其實(shí)是將6送到地址為2004開始的單元中存儲。要輸出i和j:根據(jù)變量名和地址的對應(yīng)關(guān)系,找到i和j的起始地址。然后從相應(yīng)存儲單元取出數(shù)據(jù),輸出。根據(jù)變量名和地址的對應(yīng)關(guān)系,找到i和j的起始地址。然后從相應(yīng)存儲單元取出數(shù)據(jù)3和6,做完加法運(yùn)算將結(jié)果存入k變量中(根據(jù)變量名和地址的對應(yīng)關(guān)系,找到k起始地址,寫入以2008開始的存儲單元中)。

寫程序時,是通過變量名來存取數(shù)據(jù)。其實(shí)程序經(jīng)過編譯以后已經(jīng)將變量名轉(zhuǎn)換為變量的地址,對變量值的存取都是通過地址進(jìn)行的。

存取變量值的方式有兩種:直接存取、間接存取。

直接存取方式:直接按變量地址存取變量值的方式稱為直接存取方式,或直接訪問方式。int

i;i=3;int

main(){int

i;int

*i_pointer;i_pointer=&i;*i_pointer=3;cout<<i;}i_pointer變量中保存的是i變量的起始地址。將3送到指針變量i_pointer所指向的單元(就是變量i對應(yīng)的單元)2000i_pointer

i2000

3

還有一種方式稱為間接存取(間接訪問)的方式??梢栽诔绦蛑卸x這樣一種特殊的變量,它是專門用來存放地址的。定義i_pointer為指針變量。該變量里存的是另一個變量的地址。

由于通過地址能找到所需的變量單元,因此可以說,地址指向該變量單元。因此將地址形象化地稱為“指針”。一個變量的地址稱

為該變量的指針。

如果有一個變量是專門用來存放另一變量地

址(即指針)的,則它稱為指針變量。指針變量的值(即指針變量中存放的值)是地址(即指針)。6.2.1定義指針變量

指針變量和其他變量一樣,也必須是先定義,后使在定義的時候,要指定其類型。例如:int

*pointer_1,

*pointer_2;

上句定義了兩個指針變量pointer_1和pointer_2,這兩個指針變量都只能存放整型變量的地址。因此

pointer_1和pointer_2是指向整型數(shù)據(jù)的指針變量這個int就是指針變量pointer_1、pointer_2的基型。

指針變量的基類型用來指定該指針變量可以指向的量的類型。定義指針變量的一般形式為: 基類型*指針變量名;下面都是合法的定義:

float

*pointer_3; char

*pointer_4;pointer_3是指向單精度型數(shù)據(jù)的指針變量

pointer_4是指向字符型數(shù)據(jù)的指針變量注意:“*”不是指針變量名的一部分,在定義變量時在變量名前加一個“*”表示該變量是指針變量。問題:怎樣使指針變量指向另一個變量呢(存另一個變量的地址)?只需要把被指向的變量的地址賦給指針變量即可。例如:pointer_1=&i;pointer_2=&j;以上兩句分別是將變量i的地址存放到指針變量pointer_1中將變量j的地址存放到指針變量pointer_2中。&:為取地址運(yùn)算符。

&i為變量i的地址

一般的C++編譯系統(tǒng)為每一個指針變量分配

4個字節(jié)的存儲單元,用來存放變量的地址。在定義指針變量時要注意:(1)不能用一個整數(shù)給一個指針變量賦初值。可以將一個已定義的變量的地址賦指針變量。(2)在定義指針變量時必須指定基類型。錯誤int

*p=2000;int

i;int

*p=&i;正確6.2.2引用指針變量*i_pointer為指針變量i_pointer所指向的變量。

指針變量p中存放的是變量a的地址,則*p就等價于a變量。*指針運(yùn)算符(或稱間接訪問運(yùn)算符)。例如:inti,*i_pointer;i_pointer=&i;*i_pointer=9;等價i=9;例6.1通過指針變量訪問整型變量。#include

<iostream>using

namespace

std;int

main(

){int

a,b;int

*pointer_1,*pointer_2;a=100;b=10;pointer_1=&a;pointer_2=&b;*pointer_1=200;*b=20;cout<<a<<″

″<<b<<endl;

cout<<*pointer_1<<″

″<<*pointer_2<<endl;

return

0;}運(yùn)行結(jié)果:200

20200

20附例:#include<iostream>using

namespace

std;int

main(){int

a=10,b=20,t;int

*p1=&a,*p2=&b,*pt;cout<<p1<<"

"<<p2<<endl;cout<<*p1<<"

"<<*p2<<endl;t=*p1;*p1=*p2;*p2=t;cout<<*p1<<"

"<<*p2<<endl;pt=p1;p1=p2;p2=pt;cout<<p1<<"

"<<p2<<endl;cout<<*p1<<"

"<<*p2<<endl;cout<<a<<"

"<<b<<endl;return

0;}下面對“&”和“*”運(yùn)算符再做些說明:(1)如果已執(zhí)行了“pointer_1=&a;”語句,請問&*pointer_1的含義是什么?“&”和“*”兩個運(yùn)算符的優(yōu)先級別相同,但按自右至左方向結(jié)合,因此先進(jìn)行*pointer_1的運(yùn)算,它就是變量a,再執(zhí)行&運(yùn)算。因此,&*pointer

1與&a相同,即變量a的地址。如果有pointer_2=&*pointer_1;它的作用是將

&a(a的地址)賦給pointer_2,如果pointer_2原來指向b,經(jīng)過重新賦值后它已不再指向b了,而也指向了a。(2)*&a的含義是什么?先進(jìn)行&a的運(yùn)算,得a的地址,再進(jìn)行*運(yùn)算,即&a所指向的變量,因此即為變量a。即*&a與a等價。指針變量應(yīng)用舉例

例6.2輸入a和b兩個整數(shù),按先大后小的順序輸出a和b(用指針變量處理)。

解此題的思路是:設(shè)兩個指針變量p1和p2,使它們分別指向a和b。然后通過處理,使p1指向a和b中的大者,p2指向小者,順序輸出*p1,*p2就實(shí)現(xiàn)了按先大后小的順序輸出a和b。#include

<iostream>using

namespace

std;int

main(

){int

*p1,*p2,*p,a,b;cin>>a>>b;p1=&a;p2=&b;if(a<b){p=p1;p1=p2;p2=p;}cout<<’’a=’’<<a<<’’b=’’<<b<<endl;cout<<’’max=’’<<*p1<<’’min=’’<<*p2<<endl;return

0;}45

78↙

a=45

b=78max=78

min=45請注意,這個程序的算法并沒有交換整型變量的值而是交換兩個指針變量的值。6.2.3指針作為函數(shù)參數(shù)

函數(shù)的參數(shù)不僅可以是整型、浮點(diǎn)型、字符型等數(shù)據(jù),還可以是指針類型。它的作用是

將一個變量的地址傳送給被調(diào)用函數(shù)的形參。

例6.3題目同例6.2,即對輸入的兩個整數(shù)按大小順序輸出。這里要求用函數(shù)處理,而且用指針類型的數(shù)據(jù)作函數(shù)參數(shù)。#include

<iostream>using

namespace

std;int

main(

){

void

swap(int

*p1,int

*p2);cin>>a>>b;pointer_1=&a;pointer_2=&b;if(a<b)

swap(pointer_1,pointer_2);cout<<’’max=’’<<a<<’’min=’’<<b<<endl;return

0;}void

swap(int

*p1,int

*p2)

void

swap(int

*p1,int

*p2){

int

*p;{

int

temp;p=p1;錯誤temp=*p1;

正確p1=p2;*p1=*p2;p2=p;*p2=temp;}}void

swap(int

*p1,int

*p2{int

*temp;int

*pointer_1,*pointer_2,a,b;*temp=*p1;*p1=*p2;*p2=*temp;}錯誤void

swap(int

*p1,int

*p2){int

*temp;*temp=*p1;*p1=*p2;*p2=*temp;}*temp=*p1錯誤,*temp是指針變量temp所指向的變量。由于未對temp賦值,因此temp并無確定的值(它的值是不可預(yù)見的也就是說,temp所指向的單元是不可預(yù)見的。在這樣的情況下對*temp賦值是危險的,可能破壞系統(tǒng)的正常工作狀況。

本例采取的方法是交換a和b的值,而p1和p2的值不變。

可以看到,在執(zhí)行swap函數(shù)后,主函數(shù)中的變量a和b的值改變了。這個改變不是通過將形參值傳回實(shí)參來實(shí)現(xiàn)的。請大家考慮一下能否通過調(diào)用下面的函數(shù)實(shí)現(xiàn)a和b互換。void

swap(int

x,int

y){int

temp;temp=x;x=y;y=temp;}不能

為了使在函數(shù)中改變了的變量值能被main函數(shù)所用,不能采取把要改變值的變量作為參

數(shù)的辦法,而應(yīng)該用指針變量作為函數(shù)參數(shù)。在函數(shù)執(zhí)行過程中使指針變量所指向的變量

值發(fā)生變化,函數(shù)調(diào)用結(jié)束后,這些變量值

的變化依然保留下來,這樣就實(shí)現(xiàn)了“通過

調(diào)用函數(shù)使變量的值發(fā)生變化,在主調(diào)函數(shù)

中使用這些改變了的值”的目的。

如果想通過函數(shù)調(diào)用得到n個要改變的值,可以采取下面的步驟:①在主調(diào)函數(shù)中設(shè)n個變量,用n個指針變量指向它們;②編寫被調(diào)用函數(shù),其形參為n個指針變量,這些形參指針變量應(yīng)當(dāng)與主調(diào)函數(shù)中的n個指針變量具有相同的基類型;③在主調(diào)函數(shù)中將n個指針變量作實(shí)參,將它們的值(是地址值)傳給所調(diào)用函數(shù)的n個形參指針變量,這樣,形參指針變量也指向這n個變量;④通過形參指針變量的指向,改變該n個變量的值;⑤在主調(diào)函數(shù)中就可以使用這些改變了值的變量。請注意,不能企圖通過改變形參指針變量的值而使實(shí)參指針變量的值改變。#include

<iostream>using

namespace

std;int

main(

){

void

swap(int

*p1,int

*p2);int

*pointer_1,*pointer_2,a,b;cin>>a>>b;pointer_1=&a;pointer_2=&b;if(a<b)

swap(pointer_1,pointer_2);cout<<″max=″<<a<<″

min=″<<b<<endl;return

0;}{

int

*temp;temp=p1;p1=p2;p2=temp;}void

swap(int

*p1,int

*p2)■是單向的“值傳遞”方式。指針變45

78↙max=45

min=78實(shí)參變量和形參變量之間的數(shù)據(jù)傳函數(shù)參數(shù)也要遵循這一規(guī)則。調(diào)用數(shù)時不會改變實(shí)參指針變量的值,可以改變實(shí)參指針變量所指向變量值。

請注意:不要將main函數(shù)中的swap函數(shù)調(diào)用寫成:if(a<b)

swap(*pointer_1,*pointer_2);

函數(shù)的調(diào)用可以(而且只可以)得到一個返回值(即函數(shù)值),而使用指針變量作函數(shù)參數(shù),就可以通過指針變量改變主調(diào)函數(shù)中變量的值,相當(dāng)于通過函數(shù)調(diào)用從被調(diào)用的函數(shù)中得到多個值。如果不用指針變量是難以做到這一點(diǎn)的。

例6.4輸入a,b,c3個整數(shù),按由大到小的順序輸出。思路:用上面介紹的方法,用3個指針變量指向

3個整型變量,然后用swap函數(shù)來實(shí)現(xiàn)互換3個整型變量的值。#include

<iostream>using

namespace

std;int

main(

){

void

exchange(int*,int*,int*);int

a,b,c,*p1,*p2,*p3;cin>>a>>b>>c;p1=&a;p2=&b;p3=&c;exchange(p1,p2,p3);cout<<a<<″

″<<b<<″″<<c<<endl;return

0;}void

exchange(int

*q1,int

*q2,int

*q3){void

swap(int

*,int

*);if(*q1<*q2)

swap(q1,q2);if(*q1<*q3)

swap(q1,q3);If(*q2<*q3)

swap(q2,q3);}void

swap(int

*pt1,int

*pt2){inttemp;temp=*pt1;*pt1=*pt2;*pt2=temp;}運(yùn)行情況如下:12-56

87↙87

12

-566.3數(shù)組與指針一維數(shù)組與指針

指針變量可以存放一般變量的地址,也可以存放數(shù)組元素的地址。每個數(shù)組元素都在內(nèi)存中占用存儲單元,它們都有相應(yīng)的地址。所謂數(shù)組元素的指針就是數(shù)組元素的起始地址。int

a[10];int

*p1,*p2;p1=&a[0];p2=&a[2];在C++中,數(shù)組名本身就是地址,代表數(shù)組中第一個元素(即序號為0的元素)的起始地址。int

a[10];int

*p;在定義指針變量時可以給它賦初值:int*p=&a[0];

int*p=a;p=&a[0];cout<<a;p=a;cout<<&a[0];

cout<<p;舉例int

a[]={3,2,5,9,6,4};int

*p=a;*p=20;cout<<a[0]<<‘

‘<<a[1]*]*;(;(p+1)=10;cout<<a[0]<<‘

‘<<a[1];20

220

10說明:如果指針變量p已指向數(shù)組中的一個元素,則p+1指向同一數(shù)組中的下一個元素,p-1指向前一個元素。如果p的初值為&a[0]或a,則:p+i和a+i就是a[i]的地址,或者說,它們指向a數(shù)組的第i個元素。p+i

a+i

&a[i]*(p+i)

*(a+i)

a[i]。指向數(shù)組元素的指針變量也可以帶下標(biāo)。 p[i]

*(p+i)例6.5輸出數(shù)組中的全部元素。假設(shè)有一個整型數(shù)組a,有10個元素。要輸出各元素的值。(1)下標(biāo)法int

main(

){

int

a[10];int

i;for(i=0;i<10;i++)cin>>a[i];cout<<endl;for(i=0;i<10;i++)cout<<a[i]<<″

″;cout<<endl;return

0;}(2)指針法int

main(

){

int

a[10];int

i;for(i=0;i<10;i++)cin>>*(a+i);cout<<endl;for(i=0;i<10;i++)cout<<*(a+i)<<″

″;cout<<endl;return

0;}return

0;}(3)用指針變量指向數(shù)組元素

#include<iostream>using

namespace

std;int

main(

){

int

a[10];int

i,*p=a;for(i=0;i<10;i++)cin>>*(p+i);cout<<endl;for(p=a;p<(a+10);p++)cout<<*p<<″

″;cout<<endl;在使用指針變量指向數(shù)組元素時,應(yīng)切實(shí)保證指向數(shù)組中有效的元素。for(i=0;i<10;i++)cout<<*(p+i)<<″

″;

如果先使p指向數(shù)組a的首元素(即p=a或p=&a[0]),則:(1)p++執(zhí)行之后,p等價于&a[1](2)*p++。由于++和*同優(yōu)先級,結(jié)合方向為自右而左,因此它等價于*(p++)。作用是:先得到p指向的變量的值(即*p),然后再使p

的值加1。p=a;cout<<*p++<<endl;cout<<*p<<endl;a[0]a[1]p=a;i=0;while(i<10){cout<<*(p+i);i++;}for(p=a;p<a+10;p++)cout<<*p;for(p=a;p<a+10;)cout<<*p++;p=a;i=0;while(i<10){cout<<*(p++);i++;}p=a;while(p<a+10){cout<<*p++;}

(3)*(p++)與*(++p)作用不同。若p=a,

則前者得到a[0]的值,后者得到a[1]的值。int

a[]={2,7,4,3,8,9,27,23,1,6};int

*p;p=a;cout<<*(++p);cout<<*p;77(4)(*p)++表示p所指向的元素值加1,若p=a,則(*p)++表示(a[0])++,如果a[0]=3,則執(zhí)行(a[0])++之后,a[0]的值為4。int

a[]={2,7,4,3,8,9,27,23,1,6};int

*p;p=a;cout<<(*p)++<<endl;cout<<a[0]<<endl;23(5)如果p當(dāng)前指向a[i](p=&a[i]),則*(p--):先對p進(jìn)行“*”運(yùn)算,得到a[i],再使p減1,p指向a[i-1]。*(++p):先使p自加1,再作*運(yùn)算,得到a[i+1]。*(--p):先使p自減1,再作*運(yùn)算,得到a[i-1]。cout<<*a;a++;}注意:錯誤該程序錯誤,數(shù)組名雖然是地址,但是數(shù)組名一旦被定義,就不能改變其值。而指針變量的值可以被改變for(i=0;i<10;i++){cout<<*(a+i);}正確p=a;for(i=0;i<10;i++)int

a[]={2,7,4,3,8,9,27,23,1,6};

{int

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

}cout<<*p;p++;正確6.3.2用指針變量作函數(shù)參數(shù)接收數(shù)組地址例6.6將10個整數(shù)按由小到大的順序排列.//函數(shù)聲明#include

<iostream>using

namespace

std;int

main(

){void

select_sort(int

*p,int

n);int

a[10],i;cout<<″enter

the

originl

array:″<<endl;for(i=0;i<10;i++)cin>>a[i];cout<<endl;select_sort(a,10);

//函數(shù)調(diào)用,數(shù)組名作實(shí)參cout<<″the

sorted

array:″<<endl;//輸出10個已排好序的數(shù)for(i=0;i<10;i++)cout<<a[i]<<″

″;cout<<endl;

return

0;}void

select_sort(int

*p,int

n){int

i,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;//用指針變量作形參//用指針法訪問數(shù)組元素t=*(p+k);*(p+k)=*(p+i);*(p+i)=t;}}6.3.3

二維數(shù)組與指針

指針變量也可以存放二維數(shù)組元素的地址。但是比起一維數(shù)組,使用較復(fù)雜。int

a[3][4]=

{{1,3,5,7},{9,11,13,15},{17,18,21,23}}二維數(shù)組可看作是一個一維數(shù)組。每一行作為數(shù)組的一元素。數(shù)組a是一個一維數(shù)組,有3個元素:a[0]、a[1]、a[2]每個元素又為包含4個元素的一維數(shù)組。a[0]:a[0][0]、a[0][1]、a[0][2]、a[0][3]a[1]:a[1][0]、a[1][1]、a[1][2]、a[1][3]a[2]:a[2][0]、a[2][1]、a[2][2]、a[2][3]a[3]:a[3][0]、a[3][1]、a[3][2]、a[3][3]二維數(shù)組與指針的關(guān)系

(1)int

a[3][4]=

{{1,3,5,7},{9,11,13,15},{17,18,21,23}};int

*p;p=a[0];

p=&a[0][0];p+i(若i小于列數(shù))為a[0][i]元素的起始地址。P+i*N+j(若N是數(shù)組列數(shù))為a[i][j]元素的起始地址。p+i&a[0][i]p+i*N+j&a[i][j]

*(p+i*N+j)

a[i][j]*(p+i)

a[0][i]例如:元素a[2][1]的指針(地址)可表示為:p+2*4+1p+2*4+1&a[2][1]

*(p+2*4+1)

a[2][1]例6.7輸出二維數(shù)組各元素的值。#include

<iostream>using

namespace

std;int

main(

){int

a[3][4]=

{{1,3,5,7},{9,11,13,15},{17,18,21,23}};int

*p;for(p=a[0];p<a[0]+12;p++)cout<<*p<<″

″;cout<<endl;return

0;}(2)int

a[3][4]=

{{1,3,5,7},{9,11,13,15},{17,18,21,23}}a是一維數(shù)組,包括的元素有:a[0]、a[1]、a[2]&a[0]a是a數(shù)組第1個元素的起始地址。即:

aa+i是a數(shù)組第i個元素的起始地址。即:

a+i&a[i][j]

a[i]+j

*(a+i)+j&a[i]a[i][j]

*(a[i]+j)*(*(a+i)+j)*(*(a+2)+1)例如:

a[2][1]

*(a[2]+1)注意:int

a[3][4]=

{{1,3,5,7},{9,11,13,15},{17,18,21,23}}

;int

*p=a;錯誤原因:p與a類型不匹配。a指向的元素是一個一維數(shù)組,而p指向的是一個整型變量,表示要存放的是一個整型變量的地址int

a[3][4]=

{{1,3,5,7},{9,11,13,15},{17,18,21,23}}

;int

*p=a[0];正確原因:a[0]指向的元素是a[0][0](一個整型數(shù)據(jù))。而p指向整型變量,表示要存放的是一個整型變量的地址。兩者匹配,所以正確。int

a[3][4]=

{{1,3,5,7},{9,11,13,15},{17,18,21,23}}int

(*p)[4]=a;正確int

(*p)[4]表示p是一個指針變量,它指向包含4個元素的一維數(shù)組。a[i][j]

*(*(p+i)+j)int

*p[4]表示定義了一個數(shù)組p,該數(shù)組有4個元素,都是指向整型數(shù)據(jù)的指針。例6.8

輸出二維數(shù)組任一行任一列元素的值。cout<<*(*(p+i)+j)<<endl;return

0;}#include

<iostream>using

namespace

std;int

main(

){inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};int(*p)[4],i,j;cin>>i>>j;p=a;運(yùn)行情況如下:2

3↙23例6.9輸出二維數(shù)組各元素的值#include

<iostream>using

namespace

std;int

main(

){

void

output(int

(*p)[4]);int

a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};output(a);return

0;}void

output(int

(*p)[4]){

int

i,j;for(i=0;i<3;i++)for(j=0;j<4;j++)cout<<*(*(p+i)+j)<<″

″;cout<<endl;}//形參是指向一維數(shù)組的指針變量6.4字符串與指針在C++中可以用3種方法訪問一個字符串。用字符數(shù)組存放一個字符串#include

<iostream>using

namespace

std;int

main(

){

char

str[]=’’I

loveCHINA!’’;cout<<str<<endl;return

0;}用字符串變量存放一個字符串#include

<string>#include

<iostream>using

namespace

std;int

main(

){

string

str=’’I

loveCHINA!’’;cout<<str<<endl;return

0;用字符指針指向一個字符串}#include<iostream>using

namespace

std;int

main(

){

char

*str=’’I

love

CHINA!’’;cout<<str<<endl;return

0;}例6.13

將字符串str1復(fù)制為字符串str2。#include

<iostream>using

namespace

std;int

main(

){

char

str1[]=’’I

loveCHINA!’’,str2[20],*p1,*p2;p1=str1;p2=str2;for(;*p1!=’\0’;p1++,p2++)*p2=*p1;*p2=\0′;p1=str1;p2=str2;cout<<″str1

is:

″<<p1<<endl;cout<<″str2

is:

″<<p2<<endl;return

0;}運(yùn)行結(jié)果為str1

is:

I

love

CHINA!str2

is:

I

love

CHINA!6.5函數(shù)與指針6.5.1用函數(shù)指針變量調(diào)用函數(shù)函數(shù)代碼是程序的算法指令部分,它們同樣占用內(nèi)存空間,放在代碼區(qū)。每個函數(shù)在代碼區(qū)都有地址。可以定義函數(shù)指針變量指向代碼區(qū)中的某個函數(shù),通過指針可以調(diào)用相應(yīng)的函數(shù)。例6.14求a和b中的大者。#include

<iostream>using

namespace

std;int

main(

){int

max(int

x,int

y);int

a,b,m;cin>>a>>b;m=max(a,b);cout<<″max=″<<m<<endl;return

0;}#include

<iostream>using

namespace

std;int

main(

){int

max(int

x,int

y);int

(*p)(int,int);//定義指向函數(shù)的指針變量int

a,b,m;//使p指向函數(shù)maxp=max;cin>>a>>b;m=p(a,b);cout<<″max=″<<m<<endl;return

0;}int

max(int

x,int

y){intz;if(x>y)

z=x;else

z=y;return(z);}思想:可以用一個指針變量指向max函數(shù),然后通過該指針變量調(diào)用此函數(shù)。定義指向max函數(shù)的指針變量的方法是:

int(*p)(int,int);函數(shù)max的原型:int

max(int,int);指向函數(shù)的指針變量的一般定義形式為函數(shù)類型

(*指針變量名)(函數(shù)形參表);然后通過賦值語句p=max,將函數(shù)max的入口地址賦給指針變量p。這時,p才指向函數(shù)max。函數(shù)調(diào)用語句max(a,b)等價于p(a,b)6.6返回指針值的函數(shù)

一個函數(shù)可以帶回一個整型值、字符值、實(shí)型值等,也可以帶回指針型的數(shù)據(jù),即地址。返回指針值的函數(shù)簡稱為指針函數(shù)。定義指針函數(shù)的一般形式為

類型名*函數(shù)名(參數(shù)表列);例如int

*a(int

x,int

y);函數(shù)名是a,函數(shù)返回值是一個整型變量的地址。6.7指針數(shù)組和指向指針的指針6.7.1指針數(shù)組如果一個數(shù)組,其元素均為指針類型數(shù)據(jù),該數(shù)組稱為指針數(shù)組。一維指針數(shù)組的定義形式為

類型名*數(shù)組名[數(shù)組長度];例如:int*p[4];例6.15若干字符串按字母順序(由小到大)輸出#include

<iostream>using

namespace

std;int

main(

){

void

sort(char

*name[],int

n);void

print(char

*name[],int

n);//聲明函數(shù)//聲明函數(shù)char

*name[]={’’BASIC’’,’’FORTRAN’’,’’C++’’,

’’Pascal’’,

’’COBOL’’};//定義指針數(shù)組int

n=5;sort(name,n);print(name,n);return

0;}void

sort(char

*name[],int

n){

char

*temp;int

i,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;}}}void

print(char

*name[],int

n){

int

i;for(i=0;i<n;i++)cout<<name[i]<<endl;}運(yùn)行結(jié)果為BASICCOBOLC++FORTRANPascal6.7.2指向指針的指針int

i;int

*p;int

**t;p=&i;t=&p;p是指向整型變量的指針變量

t是指向指針的指針變量例6.16

指向字符型數(shù)據(jù)的指針變量。#include

<iostream>using

namespace

std;int

main(

){

char

**p;char*name[]={’’BASIC’’,’’FORTRAN’’,’’C++’’,’’Pascal

’’,’’COBOL’’};p=name+2;cout<<*p<<endl;cout<<**p<<endl;return

0;}運(yùn)行結(jié)果為C++C6.9引用6.9.1什么是變量的引用引用是為一個變量起一個別名。假如有一個變量a,想給它起一個別名b,可以這樣寫int

a;int

&b=a;//定義a是整型變量//聲明b是a的引用(別名)經(jīng)過這樣的聲明后,a和b都代表同一變量。注意:在上述聲明中,&是引用聲明符,并不代表地址。聲明變量b為引用類型,并不需要另外開辟內(nèi)存單元來存放b的值。b和a占內(nèi)存中的同一個存儲單元,它們具有同一地址。

在聲明一個引用時,必須同時使之初始化,即聲明它代表哪一個變量。在聲明一個變量名是另一個變量的別名之后,不能再將它作為其他變量的引用(別名)。int

a1,a2;int

&b=a1;int

&b=a2;錯誤例6.17引用和變量的關(guān)系.#include

<iostream>#include

<iomanip>using

namespace

std;int

main(

){

int

a=10;int

&b=a;a=a*a;cout<<a<<setw(6)<<b<<endl;b=b/5;cout<<b<<setw(6)<<a<<endl;return

0;}運(yùn)行結(jié)果如下:100

10020

206.9.3引用作為函數(shù)參數(shù)

有了變量名,為什么還需要一個別名呢?

C++之所以增加引用類型,主要是把它作為函數(shù)參數(shù),以擴(kuò)充函數(shù)傳遞數(shù)據(jù)的功能。下例是對兩個變量進(jìn)行交換。#in

溫馨提示

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

最新文檔

評論

0/150

提交評論