【計(jì)算機(jī)應(yīng)用】指針和引用_第1頁(yè)
【計(jì)算機(jī)應(yīng)用】指針和引用_第2頁(yè)
【計(jì)算機(jī)應(yīng)用】指針和引用_第3頁(yè)
【計(jì)算機(jī)應(yīng)用】指針和引用_第4頁(yè)
【計(jì)算機(jī)應(yīng)用】指針和引用_第5頁(yè)
已閱讀5頁(yè),還剩83頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

C++大學(xué)基礎(chǔ)數(shù)程

第6指針和弓I用

北京郵電大學(xué)電信工程學(xué)院

計(jì)算機(jī)技術(shù)中心

2011-5-71

◎指針(Pointer)是C++和C的一

種數(shù)據(jù)類(lèi)型。很多其他高級(jí)語(yǔ)言

也有類(lèi)似的數(shù)據(jù)類(lèi)型。引用

(Reference)則是C++所特有的

一種數(shù)據(jù)類(lèi)型。指針和引用在概

念上和使用上都有相似之處,但

是也有重要的差別。

第六章指針和引用

6.1指針的概念

6.2指針的運(yùn)算

6.3指針和函數(shù)

6.4指針和字符串

6.5通過(guò)指針訪問(wèn)數(shù)組

6.6指針訪問(wèn)動(dòng)態(tài)內(nèi)存

6.7引用概念

a

CD

6.1.1指針和指針變量

今指針是變量的地址?;蛘哒f(shuō)是在內(nèi)存中,存放

某種類(lèi)型變量的地址。-

卷例如,定義了整型變量a,a的地址就是一個(gè)指

針。

舍也可以不定義任何變量,只是指定內(nèi)存某個(gè)地

址開(kāi)始(如0x00430100)的4個(gè)字節(jié)存放整型

變量,這樣的地址也是指針。

令存放指針的變量就是指針變量。

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-5-

6.1.1指針和指針變量

令當(dāng)聲明了一個(gè)指針變量后,確定了三件事:

■變量本身在內(nèi)存中所分配的地址和字節(jié)數(shù),指針變

量總是占有4個(gè)字節(jié);

■系統(tǒng)允許的地址范圍,以及地址單元內(nèi)可以存放的

內(nèi)容;

■指針變量可以進(jìn)行的運(yùn)算。

舍訪問(wèn)指針變量時(shí),只能看到地址。只有通過(guò)這

個(gè)地址,才能訪問(wèn)地址單元中的內(nèi)容。這樣的

訪問(wèn)稱(chēng)為對(duì)于內(nèi)存單元的間接訪問(wèn)。

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-6-

6.1.2指針變量的聲明和初始化

卷指針變量聲明的格式是:一

<類(lèi)型名〉*變量名1,*變量名2;

0例如:

int*val,*va2;

char*chl,*ch2;

卷指針變量在聲明后,變量的值(地址)是隨機(jī)

的。這樣的指針變量是不能安全的使用的。因

為其中的隨機(jī)地址完全可能不是有效的數(shù)據(jù)地

址。

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-7-

6.1.2指針變量的聲明和初始化

翁在聲明指針變量時(shí)的,有兩個(gè)含義:一

■聲明變量val、va2、chi、ch2都是指針變量;

■說(shuō)明變量val和va2的類(lèi)型是(int*)型,即指向

整型變量的指針。val和va2所指定的地址單元中,

只能存放整型數(shù)據(jù)。類(lèi)似地,chi和ch2的類(lèi)型是

(char*)型,它們所指定的地址單元中,只能存

放字符。

卷指針變量都是有類(lèi)型的.指針變量的類(lèi)型就是

它所指定的地址單元中存放的數(shù)據(jù)的類(lèi)型。

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-8-

6.1.2指針變量的聲明和初始化

令指針變量的初始化有兩種方法:在聲明時(shí)的初

始化和聲明后的初始化。

<聲明指針變量時(shí)就進(jìn)行初始化的格式是:

<類(lèi)型名〉*指針變量名=&變量名;

;■其中的變量名應(yīng)該是已經(jīng)聲明或定義的同類(lèi)型變量

名。例如:

■charchl=5Y\ch2=5A9;

■char*pchl=&chl,*pch2=&ch2;

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-9-

6.1.2指針變量的聲明和初始化

翁也可以在聲明指針變量后,用賦值的方式對(duì)它

{門(mén)進(jìn)行初始化。例如:

■intil=5Y\i2=5A9;

■int*pil,*pi2;

■pil=&il;

■pi2=&i2;

?沒(méi)有初始化指針變量是不可以使用的。編譯帶

有這樣的指針變量的程序,編譯系統(tǒng)會(huì)給出警

告,而運(yùn)行時(shí)會(huì)出現(xiàn)錯(cuò)誤。

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-10-

6.2指針的運(yùn)算

④表6.1指針的運(yùn)算

運(yùn)算符〃運(yùn)算+、

賦值運(yùn)算

=!=>>=<<=關(guān)系運(yùn)算,

++—+T:算術(shù)運(yùn)算〃

3

*P喙

new*0動(dòng)態(tài)創(chuàng)建指針。

delete^刪除動(dòng)態(tài)創(chuàng)建的指針一

->P感結(jié)麴或?qū)ο蟮某蓡T二

6.2.1指針的賦值運(yùn)算

④指針的賦值運(yùn)算一定是地址的賦值。用來(lái)對(duì)指針變量

賦值的可以是:

■同類(lèi)型變量的地址;

_■同類(lèi)型的已經(jīng)初始化的指針變量;—

-其他同類(lèi)型的指針。-

令此外,也可以用?;蛘逳ULL對(duì)指針變量賦值。使得變量

包含的是“空指針”,即不指向任何的內(nèi)存物理地址。

令必須注意:不同類(lèi)型的指針是不可以互相賦值的。在

指針賦值時(shí),不存在類(lèi)型自動(dòng)轉(zhuǎn)換的機(jī)制。

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-13-

濠例6.1觀察以下指針賦值運(yùn)算的結(jié)果。如果將注釋去

掉,結(jié)果將如何?

#include<iostream>valueofpvalis0x00000000

usingnamespacestd;0x0012FF7C0x0012FF7C

voidmain()0x0012FF740x0012FF74

注釋去掉會(huì)出現(xiàn)編譯錯(cuò)誤

{intval=100,*pval;

floatvf1=/Az,*pvf1,*pvf2;

int*pva2=NULL;

cout<<"valueofpvalis"<<pva2<<endl;

pval=&val;

pvfl=pvf2=&vf1;

cout<<pval<<""<<&val<<endl;

cout<<pvf1<<""<<pvf2<<endl;

//pvfl=pval;

2011-5、北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-14-

6.2.2間接引用運(yùn)算

令間接引用運(yùn)算符“*”是一種一元算符,它和

指針變量連用,對(duì)指針?biāo)赶虻膬?nèi)存地址單元

進(jìn)行間接訪問(wèn)。使用的格式是:

*指針變量一

④如果指針變量iptr指向整型變量va,*iptr就

是變量va的內(nèi)容

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-15-

零例6.2對(duì)變量的直接訪問(wèn)和間接訪問(wèn):寫(xiě)出以下程序

運(yùn)行結(jié)果。

#include<iostream>運(yùn)行結(jié)果:

usingnamespacestd;*ch=a

voidmain()chl=B

*ch=d

{charchl=/a',*ch;

intkl=100;

ch=&chl;//指針ch指向變量chi

cout<<"*ch="<<*ch<<endl;//間接訪問(wèn)

*ch=,W;

cout<<"chl="<<chl<<endl;//直接訪問(wèn)-

chl=kl;

cout<<n*ch="<<*ch<<endl;”間接訪問(wèn)

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-16-

?例6.3定義指向指針的指針變量。觀察對(duì)這種指針變量

間接訪問(wèn)的結(jié)果。

運(yùn)行結(jié)果:

*pva=100

#include<iostream>*ppva=0x0012FF7C

usingnamespacestd;pva=0x0012FF7C

voidmain()

{intva=100,*pva,**ppva;//ppva是指向指針的指針

intkl=100;

pva=&va;

cout<<"*pva="<<*pva<<endl;”間接訪問(wèn)結(jié)果是整型數(shù)

ppva=&pva;

cout<<"*ppva="<<*ppva<<endl//間接訪問(wèn)結(jié)果是地址

cout<<"pva="<<pva<<endl;//就是指針pva的內(nèi)容

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-17-

6.2.2間接引用運(yùn)算

OxD012FF7400

12

FF

73*ppva

pva0x0012FF78CIO

12

FF+pva

7C

va0ifi012FF7C64

00

00

00

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-18-

6.2.3指針的算術(shù)運(yùn)算

④指針可以進(jìn)行的算術(shù)運(yùn)算只有加法和減法。

合指針可以和一個(gè)整數(shù)n做加法或者減法運(yùn)算。

short*pamt*pb

pa-2

指針p和整數(shù)n相加(相

pa-1減)的含義是指向當(dāng)前

指向位置p的前方或后

P』方第n個(gè)數(shù)據(jù)的地址。

pa+i

pa+2

pa+3

pb+2

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-19-

令傷”6.4通過(guò)指針的間接訪問(wèn),輸出下標(biāo)為偶數(shù)的數(shù)組元

素的值。

數(shù)組第一個(gè)元素(下標(biāo)為|

#include<iostream>鉆4.0.4-.Lm#/古心+匕d1.

usingnamespacestd;每次循環(huán),指針加2

voidmain()

6,93,108},*k;

k=&k1[0];

cout?"k1["?i?"]=,'?*(k+i)?”

cout?endl;

運(yùn)行結(jié)果:

Kl[0]=llkl[2]=37....

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-20-

6.2.3指針的算術(shù)運(yùn)算

⑥指針和指針的直接加法是沒(méi)有意義的,

也是不允許的。

④指針和指針的減法是可以進(jìn)行的,其意

義是求出兩個(gè)指針之間可以存放幾個(gè)指

定類(lèi)型的數(shù)據(jù)。

翁不允許用一個(gè)整數(shù)減一個(gè)指針。

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-21-

6.2.4指針的關(guān)系運(yùn)算和邏輯運(yùn)算

令相同類(lèi)型的指針可以進(jìn)行各種關(guān)系運(yùn)算。比較

兩個(gè)指針相等還是不相等。

卷進(jìn)行指針“大于”、“小于”的比較,只是要

判定指針在內(nèi)存中的相對(duì)位置。

卷指針和一般的整數(shù)比較是沒(méi)有意義的,也是不

允許的。惟一可以和指針比較的整數(shù)是0。通

過(guò)指針和0的比較來(lái)判定指針本身是不是空指

針。

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-22-

6.2.5void類(lèi)型指針

?void類(lèi)型的指針就是“無(wú)類(lèi)型”指針。聲明的

方式如下:

void*<指針名);

<void類(lèi)型的指針變量中存放的也是內(nèi)存的地址,

但是不指定這個(gè)地址單元內(nèi)的數(shù)據(jù)的類(lèi)型。

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-23-

6.2.5void類(lèi)型指針

令void類(lèi)型的指針的使用:

■任何其他類(lèi)型的指針都可以賦值給void指針。必須

注意,這樣賦值后的void指針的類(lèi)型仍然是void。

■void類(lèi)型指針不可以直接賦值給任何其他類(lèi)型的指

針。

■無(wú)論何時(shí),void指針都不可以通過(guò)間接引用來(lái)訪問(wèn)

內(nèi)存中的數(shù)據(jù)。

■要通過(guò)void類(lèi)型指針訪問(wèn)內(nèi)存的數(shù)據(jù),必須進(jìn)行指

針類(lèi)型的強(qiáng)制轉(zhuǎn)換,才可以通過(guò)指針間接引用訪問(wèn)

內(nèi)存數(shù)據(jù)。

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-24-

十例6.5使用memcpy通用復(fù)制函數(shù)復(fù)制數(shù)組。

#include<iostream>

usingnamespacestd;

復(fù)制字符數(shù)據(jù),10個(gè)

#include<string.h>

voidmain()T復(fù)制整型數(shù)據(jù),12個(gè)

{charsrc[10]=H012345678";字節(jié)

chardest[10];

char*pc=(char*)memcpy(dest,src,1

cout?pc?endl;運(yùn)行結(jié)果:

ints1[3]={1,2,3};012345678

intd1[3];123

int*pi=(int*)memcpy(d1,s1,12);

cout?*pi?""?*(pi+1)?""?*(pi+2)?endl;

}

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-25-

6.2.5void類(lèi)型指針

令void類(lèi)型指針還有一個(gè)具體的應(yīng)用:顯示字符

指針的內(nèi)容。除了字符指針外,其他指針都可

以直接用cout語(yǔ)句來(lái)輸出地址值。但是,用

cout輸出字符指針時(shí),則是輸出它所指向的字

符串??梢詫⒆址羔槒?qiáng)制轉(zhuǎn)換為void指針,

再用cout語(yǔ)句輸出,就可以看到地址值。如:

char*pch="HelloC++";

cout<<pch<<endl;

cout<<(void*)pch<<endl;

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-26-

6.3指針和函數(shù)

◎在程序設(shè)計(jì)中,指針有很多應(yīng)用。其中一

之一就是用指針作為函數(shù)的參數(shù),從而

形成了C++函數(shù)調(diào)用中的另一種調(diào)用方式:

地址調(diào)用。

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-28-

6.3.1指針作為函數(shù)的參數(shù)

卷用指針作為函數(shù)參數(shù),實(shí)現(xiàn)地址調(diào)用,必須滿

足以下條件:

1■函數(shù)的形式參數(shù)是指針變量;

■函數(shù)的實(shí)參數(shù)是內(nèi)存的地址,具體來(lái)說(shuō)可以

是數(shù)組名、變量的地址、用變量地址初始化

的指針;

■形參指針類(lèi)型和實(shí)參地址類(lèi)型必須相同。

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-29-

6.3.1指針作為函數(shù)的參數(shù)

翁滿足以上條件后,這樣的函數(shù)調(diào)用在使用上有

以下的特點(diǎn):

■實(shí)參傳遞給形參的是內(nèi)存的地址,所以形參指

針指向?qū)崊⒆兞浚?/p>

■形參指針通過(guò)間接引用,直接訪問(wèn)實(shí)參變量,

包括改變實(shí)參變量的值;

■函數(shù)調(diào)用后,可以保留對(duì)實(shí)參變量的操作結(jié)果,

如果有多個(gè)實(shí)參,就可以有多個(gè)實(shí)參變量在函

數(shù)調(diào)用中得到修改。

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-30-

,例6.6編寫(xiě)數(shù)據(jù)交換的函數(shù)。在main中調(diào)用這個(gè)函數(shù),

交換main中定義的變量。

#include<iostream>變量的地址作為實(shí)參數(shù)

usingnamespacestd;

voidSwap(int*a,int*b);指針變量作為形式參數(shù)

voidmain()

{intx(5),y(10);

coutvv”主函數(shù)變="?y?endl;

Swap(&x,&y);

COUt<V”返回后變量的值i^"?x?"y="?y?endl;

voidSwap(int*a,int*b)運(yùn)行結(jié)果:

{intt;主函數(shù)變量的值:x=5y=10

t=*a;函數(shù)中完成了交換:*a=10*b=5

*

a=*b;返回后變量的值:x=10y=5

*b=t;

COUtVV”函數(shù)中完成了交換:*a="?*a?"*b="?*b?endl;

}

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-31-

6.3.1指針作為函數(shù)的參數(shù)

令程序中用變量X和y的地址作實(shí)參,傳遞給指針

a和b,如圖6.1(a)。通過(guò)間接引用*a和*b進(jìn)行

交換,實(shí)際上就是x和y進(jìn)行交換,如圖6.1(b)。

㈤(b)

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-32-

④例6.7指針變量指向一個(gè)數(shù)組。用指針變量作為實(shí)參調(diào)

用一個(gè)函數(shù)。在函數(shù)中指針指向數(shù)組的第二個(gè)元素。觀

察函數(shù)返回后,實(shí)參指針值有無(wú)變化。

#include<iostream>

指針作為實(shí)參數(shù)

usingnamespacestd;

voidMove(int*a);

voidmain()d指針變量作為形式參數(shù)

{intx[5]={10,20,30,40這d」JZ/

COUt<V”調(diào)色?*px?end

Move(px);-,x^^完成了指針移動(dòng):*a=20

COlltVV”調(diào)用后的px”;倜用后的px沒(méi)有變化*px還是10

jf(px==x)coutvv”沒(méi)有多還是“v<*pxvvendl;

elsecout<v”也向,*px變?yōu)?vv*pxvvendl;

}

voidMove(int*a)

{a=a+1;

coutvv”函數(shù)中完成了指針移動(dòng):*a="?*a?endl;

)

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-33-

6.3.2指針的指針作為函數(shù)的參數(shù)

?如果一定要改變實(shí)參指針的值,可以用

指針變量的地址作實(shí)參,形式參數(shù)就應(yīng)

該是指針的指針。

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-34-

例6.8修改例6.7,使得實(shí)參指針?lè)祷睾?,指向新的地址?/p>

#include<iostream>

usingnamespacestd;」指針的地址作為實(shí)參數(shù)

voidMove(int**a);

voidmain()H指針的指針作為形式參數(shù)

{intx[5]={10,2仙刖修卬j,”px‘父為

?0111:<<"調(diào)用喟^的*「*="<0「乂<<611(11

Move(&px);

cout<〈"調(diào)用后的px

if(px==x)cout<<">^^J5n,*px還是"<<*px〈〈endl;

elsecout<<移動(dòng),*px變?yōu)?<<*px<<endl;

}

voidMove(int**a)

{*a=*a+l;

cout<<"函數(shù)中完成了指針移動(dòng):**a="<<**a<<endl;

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-35-

6.3.3傳遞參數(shù)的保護(hù):指針和常量

翁通過(guò)數(shù)組名的地址調(diào)用,可以改變實(shí)參數(shù)組的

內(nèi)容。

手但是,并不是所有以數(shù)組名作為實(shí)參的函數(shù)調(diào)

用,都需要改變數(shù)組的值。例如,在調(diào)用一個(gè)

求數(shù)組最大值的函數(shù)時(shí),就不希望數(shù)組的值發(fā)

生變化。希望在函數(shù)中能夠限制對(duì)數(shù)組元素的

修改。

卷使用常指針可以達(dá)到這個(gè)目的。

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-36-

6.3.3傳遞參數(shù)的保護(hù):指針和常量

翁常指針是指向常量的指針(Pointerto

Constantdata)的習(xí)慣說(shuō)法。就是規(guī)定指針

所指向的內(nèi)容不可以通過(guò)指針的間接引用來(lái)改

z變。::

今常指針說(shuō)明的格式是:

const<類(lèi)型名>*<指針名);

■伊J或口:constint*ptint;

■指針ptint的類(lèi)型是(constint*),也就是指向一

個(gè)恒定的整型數(shù)。

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-37-

事例6.10常指針不例。觀察以下程序的運(yùn)行。

針聲明I

#include<iostream>

usingnamespacestd;

voidmain()一^88ssi釋去掉會(huì)出現(xiàn)編譯錯(cuò)誤

{intia=10,ib=20;

constint

ptint=&ia;

cout?*ptint?endl;

ptint=&ib;"改變?yōu)閕b的地址

ib=ib+100;//ib本身仍然可以改變

cout?*ptint?end|^^

//*ptint=1OO;〕〃語(yǔ)句錯(cuò)誤:左值是常量:

)

運(yùn)行結(jié)果:

10

120

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-38-

6.3.3傳遞參數(shù)的保護(hù):指針和常量

翁指針常量(Pointerconstant)。

■指針本身的內(nèi)容是個(gè)常量,不可以改變。.

-指針常量聲明的格式是:

<類(lèi)型名>*const<指針名>=<初值);

■例如:

charch,*constptch=&ch;

今數(shù)組名就是數(shù)組的首地址?,F(xiàn)在可以說(shuō):數(shù)組

名就是一個(gè)指針常量。

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-39-

例6.11指針常量示例。指出以下程序的錯(cuò)誤。

語(yǔ)句有錯(cuò):常量不

#include<iostream>能當(dāng)左值

usingnamespacestd;

voidmain()語(yǔ)句有錯(cuò),地

{inta=10,b=100;址類(lèi)型不同

int*constpa=&a;

cout?*pa?endl;

*pa=20;用是允許的

cout?a?

pa=&b;

constintc=50;

錯(cuò)誤語(yǔ)句注釋掉

int*constpc=&c;后運(yùn)行結(jié)果:

)10

20

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-40-

歌例6.12用常指針作形參,函數(shù)printstring可以輸出數(shù)

}

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-41-

6.3.4指針函數(shù)

翁如果一個(gè)函數(shù)的返回值是指針,則這樣的函數(shù)

稱(chēng)為指針函數(shù)。如:

int*funcOl(intk);

一■函數(shù)funcOl返回一個(gè)指向整型數(shù)據(jù)的指針。—

■返回指針,實(shí)際就是返回一個(gè)內(nèi)存的地址。

■要注意:不能返回函數(shù)中局部變量的地址。這樣的

地址處于內(nèi)存的堆棧區(qū),是所有函數(shù)公用的區(qū)域。

其中的數(shù)據(jù)是不穩(wěn)定的,可能因?yàn)槠渌瘮?shù)的執(zhí)行

而發(fā)生改變。

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-42-

十例6.13返回不同地址的指針函數(shù)。觀察運(yùn)行的結(jié)果。

#include<iostream>

返回全局變量或

usingnamespacestd

者vb的地址

intva=100;全局變量

int*get_int(int*pt,intj)

{intvalue=300,*pti=pt;

if(j==O||j==1)returnpti;

for(inti=0;i<3;i++)運(yùn)行結(jié)果

{if(i==O)ptint=get_int(&va,i);i=0*ptint=100

elseif(i==1)ptint=get_int(&vb,i);i=l*ptint=200

i=2*ptint=-858993460

elseif(i==2)ptint=get_int(&va,i);

cout?"i="?i<<"*ptint=,'?*ptint?endl;

加11-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-43-

}

令6.4指針和字符串

6.4.1字符串處理的兩種方式

6C++字符串常量是用雙引號(hào)括起的字符序列,

并以字符‘\0’作為結(jié)束標(biāo)志。如

"Thisisastring”。

卷字符串常量存放在內(nèi)存的某個(gè)區(qū)域,有自己固

定的首地址。

?如果將字符串常量的首地址看成是指針,這種

指針既是常指針,也是指針常量。

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-45-

6.4.1字符串處理的兩種方式

?C++處理字符串有兩種方式:數(shù)組方式和指針

方式。

卷數(shù)組方式是將字符串存入字符數(shù)組后,再進(jìn)行

處理。一般可以在聲明數(shù)組的時(shí)候用字符串來(lái)

初始化:

charstring.array[]="What5saniceday!n;

4指針?lè)绞绞怯米址A縼?lái)初始化一個(gè)字符指

針:

char*string_pt="Whafsaniceday!

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-46-

6.4.1字符串處理的兩種方式

表62兩種字符串處理方式的比較“

已定義口以四

5AMisabook"/'*^="Thisisabook"/

直接輸出小可以。夠?。?射“可以+、

直接輸入二可以Q巡>>§3匕口

可以,

直接更改口乳或微—OK"產(chǎn)小可以》義鵬吐

可V

賦值一上戛夜尸不可以“

______Z〃

常量不能放運(yùn)行時(shí)會(huì)出

在等式左邊錯(cuò)

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-47-

6.4.2字符串操作函數(shù)

表5.3OH的部分字符串處理函數(shù)-

功能*函數(shù)原型/返回值一說(shuō)明一

字符串長(zhǎng)度一曝效威constcharString)尸長(zhǎng)度值QW不計(jì)入。

字符串復(fù)制,&觸/曬,狽char*31,constchar吟2)H復(fù)制的字符串Gsi要有足年空間,

按字符數(shù)復(fù)制"直毆「魏融頌char%l,constc皿%2,如辦)尸復(fù)制的字符串"51要有足夠空間,:

<0=0>0對(duì)應(yīng)

字符串比較小也上名如種(constchar與[constchar*s及37(

sl<s2,sl=s2,sl>s2^

字符串連報(bào)“0即聞堿(char*式,constchar與2),丁連接后的字符串小si要有足始空間十

調(diào)用這些函數(shù)時(shí),原則上可以使用字符數(shù)組名、已經(jīng)初始

化的字符指針作為實(shí)參數(shù)。字符串常量還可以作為源字符

串的實(shí)參數(shù)。目的串必須是可寫(xiě)的。

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-48-

'?例6.14strcpy和strncpy的比較。

#include<iostream>

復(fù)制arrayl到array2,

#include<string>沒(méi)有問(wèn)題

usingnamespacestd;

voidmain()

復(fù)制array1到

{intn;

<rray3,空間不夠

char*array1="HappyBirthda

chararray3[15];按實(shí)際數(shù)組大小,

chararray2[25];復(fù)制array1到

array3,沒(méi)有問(wèn)題

strcpy(array2,arrayl

cout?"Thestringinarraylis:"

?"\nThestringinarrav^i^array2

/*strcpy(array3,arrayl);

cout?array3?endl;*/

n=sizeof(array3);

strncpy(array3,arrayl,n-1);//復(fù)制ar「ay1的n-1個(gè)字符到array3

array3[14]='\0';//添加'\0'到array3

cout?"Thestringinarray3is:"?array3?endl;

}2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)竟機(jī)技術(shù)中心-49-

揚(yáng)

M

9

6.5通過(guò)指針訪問(wèn)數(shù)組

■指針和數(shù)組有天然的聯(lián)系。因?yàn)閿?shù)組名本

身就是地址,也就是某種類(lèi)型的指針。將

指針和數(shù)組名聯(lián)系起來(lái),訪問(wèn)數(shù)組就多了

二一種方法。

⑥雖然一維數(shù)組名和二維數(shù)組名都是地址,

都可以看作是某種指針,但是指針的類(lèi)型

是不同的。因此,通過(guò)指針訪問(wèn)一維數(shù)組

和二維數(shù)組的方法是不同的。

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-51-

6.5.1通過(guò)指針訪問(wèn)一維數(shù)組

?要通過(guò)指針訪問(wèn)一維數(shù)組,必須首先聲明一個(gè)和

數(shù)組類(lèi)型相同的指針,并且用數(shù)組名來(lái)對(duì)指針初

始化,如:

intA[10],*pa=A;

?然后,就可以用多種方式訪問(wèn)數(shù)組元素:

■數(shù)組名和下標(biāo),如A[0]、A[4];

■指針和下標(biāo),如pa[0]、pa[4];

■指針加偏移量的間接引用,如*(pa+4);

■數(shù)組名加偏移量的間接引用,如*(A+4);

■指針自加后的間接引用,如*pa++。

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-52-

*例6.15求數(shù)組內(nèi)所存放的字符串的長(zhǎng)g

#include<iostream>廿式1:數(shù)組名和下

usingnamespacestd;

方式2:指針和下

voidmain()________一二

{charChArray[]="Thisisastring方式3:數(shù)組名加

intij,k,offset1,offset2;呼移量的間接引用

ptch=ChArray;L方式4:指針加偏

for(i=0;ChArray[i]!='\0';i++j^!5!!!!5J移量的間接引用

hestring方式5:指針自加

的間接引用

ringis

for(offset1=0:*(ChArrav+offsetn^ggytoffset1

cout?"Thelengthofth^tfTngis:"<<Q^^^<endl;

運(yùn)行結(jié)果

for(offset2=0;*(ptch+offset2)!='\0^QjK^?^+);

都相同

cout?"Thelengthofthngis:"?offset2?endl;

for(k=0;*ptch++!='\0';k++);

cout?"Thelengthofthestringis:"?k?endl;

}

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-53-

令例6.16求整型數(shù)組的平均值,顯示駕組元素和平均值。

#include<iostream>j.旨針當(dāng)始化|

usingnamespacestd;

voidmain()求數(shù)組元素的數(shù)目

{intintArray[10]={8,11,23,34,45^5^^??<86,97},*ptint;

inti.num.sum;

floataverage;

1r平均值

ptint=intArray;

sum=0;

num=sizeof(intArray)/sizeof(*intArray);針,次初始化

for(i=0;i<num;i++)5ss數(shù)組元素和它

sum=sum+*ptint++;

average=(float)sum/num;們的平均值

ptint=intArray;

COUtVV”數(shù)組元素是:\n;數(shù)組元素是:

for(i=0;i<num;i++)8112334455665788697

cout?*ptint++?"";平均值是:50.3

coutvv”\n平均值是:"?average?endl;

北京郵電大海信工程學(xué)院計(jì)算機(jī)技術(shù)中心-54-

2011-5-7

6.5.2通過(guò)指針訪問(wèn)二維數(shù)組

?二維數(shù)組可以看成是一維數(shù)組的一維數(shù)組。二

維數(shù)組名雖然也是地址(指針),但是卻和一

維數(shù)組名有不同的類(lèi)型。

④對(duì)一維數(shù)組A[5],數(shù)組名A的地址,就是數(shù)組

第一個(gè)元素A[0]的地址。指針的類(lèi)型是指向數(shù)

組元素的指針。A+1就是元素A[l]的地址。

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-55-

6.5.2通過(guò)指針訪問(wèn)二維數(shù)組

卷對(duì)二維數(shù)組B[3][4],數(shù)組名B的地址,則是其

中第一個(gè)一維數(shù)組B[0]的地址。指針的類(lèi)型是

指向一維數(shù)組的指針。B+1就是下一個(gè)一維數(shù)

組B[l]的地址。如圖6.3所示。

charB[3][4]charC⑶[2]

BCc出^

1

+

口1

B+1c1cJ

B+2c+2c已]

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-56-

6.5.2通過(guò)指針訪問(wèn)二維數(shù)組

?在定義指向一維數(shù)組的指針時(shí),還必須指出一

維數(shù)組的大小。

令聲明指向一維數(shù)組的指針的格式如下:

〈類(lèi)型名〉(*指針變量名)[一維數(shù)組大小];::

④例如,和圖6.3中兩個(gè)二維數(shù)組所對(duì)應(yīng)的指向

一維數(shù)組的指針定義如下:

■char(*ptchb)[4],(*ptchc)[2];

■ptchb=B;ptchc=C;

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-57-

6.5.2通過(guò)指針訪問(wèn)二維數(shù)組

卷對(duì)于指向一維數(shù)組的指針,具有以下的特征:

■二維數(shù)組名是指向一維數(shù)組的指針,而不是指向數(shù)

組元素的指針。

■指向一維數(shù)組指針加1的結(jié)果,是指向下一個(gè)一維

數(shù)組的指針。

■指向一維數(shù)組的指針的間接引用的結(jié)果仍然是地址,

即*ptchb仍然是地址。只是地址的類(lèi)型變了。變?yōu)?/p>

一維數(shù)組B[0]第一個(gè)元素B[0][0]的地址。

■因?yàn)?ptchb是數(shù)組元素的地址,**ptchb就是數(shù)組

元素的值。用指向一維數(shù)組指針訪問(wèn)二維數(shù)組第i行

第j列元素的一般公式是*(*(指針名+i)+j)o

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-58-

?例6.17比較指向一維;

#include<iostream>

usingnamespacestd;

voidmain()B的第1行地址

{shortB[3][4],C[3][2];

short(*ptshb)[4],(*ptshc)[2];

ptshb=B;ptshc=C;

cout<v"ptshb的地址是:"?ptshb?"\n";

cout?"ptchb+1的地址是:H?ptshb+1?C的第1行地址

coutvv”ptchc的地址是:"?ptshc?"\n^_

coutvv”ptchc+1的地址是:"?ptshc+1?"\n";

比較不同的指向一維數(shù)組指針的差別

ptshb的地址是:0X0012FF68

ptchb+1的地址是:0x0012FF70

ptchc的地址是:0x0012FF5c

ptchc+1的地址是:0x0012FF60

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-59-

逐例6.17比較指向一維數(shù)組的指針和堀向數(shù)組元素的堀針。

B的第0行地址

coutvv”不同類(lèi)型的指針\n”;?

coutvv”ptshb的地址是:"?ptshb?endl;|B的第0行第0列

coutvv”*ptshb的地址是:纂的地址

coutvv”*ptshb+1的地址是:"?*ptshb+1?endlv

coutvv“B[0][1]的地址是:"?&B[0][1]?e^dl;、

〃coutvv"ptchb和*ptchb相等嗎?"?(ptchb==\ichb)

語(yǔ)法錯(cuò)誤

coutv<”*ptshb+1和相等嗎?\

弋圖第0行第1列

if(*ptshb+1==&B[O][1])cout?"Yes"?endl;C妁地址

}、、?

不同類(lèi)型的指針

B的第0行第1列

ptshb的地址是:0X0012FF68

元素的地址

*ptshb的地址是:0X0012FF68

*ptshb+1的地址是:0x0012FF6A

的地址是:0x0012FF6A

*ptshb+1和&B[0][1]相等嗎?Yes

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-60-

?例6.18用單循環(huán)程序,求二維數(shù)組元素的平均值。

指向一維*

數(shù)組元素的數(shù)目,

#include<iostream>的初始“4

*dArray就是元素

usingnamespacestd;dArray[0][0]

voidmain()

{intdArray[3][4]={32,42,12,25,56,7[4];

intsum,j;數(shù)組求和

floataverage;

sum=0;

pt=dArray;求平均值

j=sizeofdArray/sizeof**dArray;

for(inti=0;i<j;i++)輸出平均值

sum=sum+*(*pt+i);

average=(float)sum/j;

coutvv”數(shù)據(jù)的平均值等于:"?average?endl;

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

數(shù)據(jù)的平均值等于57.0833

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-61-

46.5程序開(kāi)發(fā)過(guò)程

6.5.3指針數(shù)組

?若數(shù)組元素是某種類(lèi)型的指針,這樣的數(shù)組稱(chēng)

為指針數(shù)組。

多指針數(shù)組聲明的格式如下:

二<類(lèi)型)*<數(shù)組名)[常量表達(dá)式];

■例如:

char*member_name[10];

④注意和聲明指向一維數(shù)組指針的差別:

char(*member_pointer)[10];

6.5.3指針數(shù)組

④指向字符的指針:

char*member_name[]={"Merry66,"John","Hill"};

?指向這樣的指針數(shù)組的指針:

char**arr=member_name;

④或者:

char**arr;arr=member_name;

令這樣定義后,*arr就是指向字符串的指針,以下語(yǔ)句

cout<<*arr<<endl;

圈顯示數(shù)組中的第一個(gè)字符串"Merry"。

十例6.19將若干字符串存入指針數(shù)組,并以NULL表示結(jié)束。

將這些字符串按升序排序,輸出排序后的字符串。.

函加盾刑

#include<string>函數(shù)原型

#include<iostream>

usingnamespacestd;

voidPrint(char*[]);指針數(shù)組

voidString_sort(char*[]);

voidmain()

{char*pn[]={"George","Bill"J"Wendy","Abraham"J"Bruce"5NULL};

〃指針數(shù)組

String_sort(pn);—

Print(pn);一■

}輸出平均值

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-65-

voidString_sort(char*arr[])

{char**p1,**p2,*p3;

P::arr;一35tfss和其余的.個(gè)指針

p2=arr+1;指的字符串比較

whi"n1+1X=NUII-----------------------------------------------------

{while(*p2!=NULL)—*]如果字符串*p1大

{if(strcmp(*p1,*p2)>0)----于*p2

P2++;}

p1++;

p2=p1+1;

)Sortedstringsare:

voidPrint(char*arr[])

Abraham

{cout?"Sortedstringsare:"?endl;B川

while(*arr!=NULL)Bruce

{cout?*arr?endl;George

a}北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中.Wendy.

6.5.4命令行參數(shù)

<命令行參數(shù)是main函數(shù)的參數(shù)。帶有命令行參

數(shù)的main函數(shù)的原型是:

<類(lèi)型)main(intargc,char*argv[]);

—■argc:整數(shù),存放命令行參數(shù)的數(shù)目。一

■argv[]:指針數(shù)組,存放所輸入的命令行參

數(shù)。其中argv[0]是所執(zhí)行的程序名,

argv[argc-1]是最后一個(gè)輸入的參數(shù)字符串,

argv[argc]中自動(dòng)的存入NULL,表示輸入結(jié)

束。

例6.20顯示命令行參數(shù)的程序。

#include<iostream>從第0個(gè)到第argc

usingnamespacestd;顯示參數(shù)

voidmain(intargc,char*argv[]),

{cout?"Thecommandlineargurj^^^

for(inti=0;i<argc;++i

cout?argv[i]?'

}

2011-5-7北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-68-

例6.21對(duì)命令行輸入的字符串進(jìn)行排序并輸出排序結(jié)果。

#include<string>

#include<conio.h>

從第1個(gè)參數(shù)開(kāi)始

#include<iostream>排序

usingnamespacestd;

voidPrint(char*[]);

voidString_sort(char*[]);

voidmain(intargc,char*arg

{String_sort(argv+1);如在命令行輸入:

Print(argv+1);E:\myfile\proj01\debug\proj01.exebed

getche();abcaabbbd

回車(chē)后運(yùn)行并顯示:

}Sortedstringsare:

aab

abc

心切理學(xué)院計(jì)算機(jī)技術(shù)中心

2011-5-7北京郵電大學(xué)用-69-

bed

2

9

6

6.6指針訪問(wèn)動(dòng)態(tài)內(nèi)存

翁動(dòng)態(tài)內(nèi)存是在程序執(zhí)行時(shí)才可以申請(qǐng)、使用和

釋放的內(nèi)存。也就是存放動(dòng)態(tài)數(shù)據(jù)的內(nèi)

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論