版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025西南計(jì)算機(jī)有限責(zé)任公司招聘21人筆試考試參考題庫(kù)及答案解析
- 2025云南昆明市尋甸縣衛(wèi)生健康系統(tǒng)第二批招聘編外人員40人參考考試試題及答案解析
- 2025四川宜賓臨港投資建設(shè)集團(tuán)有限公司下屬子公司第五批項(xiàng)目制員工招聘3人備考筆試試題及答案解析
- 2025甘肅省新華書(shū)店有限責(zé)任公司招聘(57人)模擬筆試試題及答案解析
- 深度解析(2026)《GBT 25781-2010 1-萘胺》(2026年)深度解析
- 深度解析(2026)《GBT 25719-2010電液錘 技術(shù)條件》(2026年)深度解析
- 2025福建福清市明德幼兒園招聘筆試考試備考題庫(kù)及答案解析
- 2025年安徽江淮汽車(chē)集團(tuán)股份有限公司公開(kāi)招聘工作人員1人考試筆試參考題庫(kù)附答案解析
- 2025北方自動(dòng)控制技術(shù)研究所招聘43人備考考試試題及答案解析
- 《兩、三位數(shù)除以一位數(shù)》數(shù)學(xué)課件教案
- 項(xiàng)目分包制合同范本
- (2026.01.01施行)《生態(tài)環(huán)境監(jiān)測(cè)條例》解讀與實(shí)施指南課件
- 2025年及未來(lái)5年市場(chǎng)數(shù)據(jù)中國(guó)廢舊輪胎循環(huán)利用市場(chǎng)深度分析及投資戰(zhàn)略咨詢(xún)報(bào)告
- 《科研倫理與學(xué)術(shù)規(guī)范》期末考試試題及答案2025
- 2025天津大學(xué)管理崗位集中招聘15人考試筆試備考題庫(kù)及答案解析
- Unit 7 When Tomorrow Comes Section A (1a-1d) 課件 2025-2026學(xué)年人教版八年級(jí)英語(yǔ)上冊(cè)
- 2025年影像成像原理考試題庫(kù)
- 2025年智能制造工廠改造項(xiàng)目可行性研究報(bào)告及總結(jié)分析
- 國(guó)電投面試技巧與實(shí)戰(zhàn)經(jīng)驗(yàn)交流
- 律師事務(wù)所訴訟案件辦案進(jìn)度及當(dāng)事人滿意度績(jī)效評(píng)定表
- 2025年公務(wù)員多省聯(lián)考《申論》題(陜西A卷)及參考答案
評(píng)論
0/150
提交評(píng)論