電腦課-實(shí)驗(yàn)五第6章指針_第1頁
電腦課-實(shí)驗(yàn)五第6章指針_第2頁
電腦課-實(shí)驗(yàn)五第6章指針_第3頁
電腦課-實(shí)驗(yàn)五第6章指針_第4頁
電腦課-實(shí)驗(yàn)五第6章指針_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余56頁可下載查看

付費(fèi)下載

下載本文檔

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

文檔簡介

第6章指針6.1指針的概念6.2變量與指針6.3數(shù)組與指針6.4字符串與指針6.5函數(shù)與指針6.6返回指針值的函數(shù)6.7指針數(shù)組和指向指針的指針6.8引用6.1指針的概念在高級語言編程中,面對的是變量名。而源程序經(jīng)過編譯處理后,每一個變量在程序執(zhí)行前,將分配在指定的位置上。程序執(zhí)行過程中,計(jì)算機(jī)到與變量名對應(yīng)的內(nèi)存地址去訪問放在那里的數(shù)據(jù)。這種按變量的地址直接存取變量的方法稱為“直接訪問”方式。int

a;a180011:FF2Ba=18;還有一種方式,將一個變量的地址放在另一個變量中,這時存取變量,可通過存放地址的變量間接地訪問存放變量的內(nèi)存空間。inta=18;a180011:FF2B0011:FF2Bip這個存放地址的變量稱為指針。6.2變量與指針指針變量是一種特殊的變量,它和以前學(xué)過的其他類型的變量的不同之處是:用它來指向另一個變量。一般的C++編譯系統(tǒng)為每一個指針變量分配4個字節(jié)的存儲單元,用來存放變量的地址。6.2.1定義指針變量格式:類型*變量名1<,*變量名2>; int*ip; char*cp;6.2.2建立指針建立指針包括定義指針和給指針賦初值。用“&”操作符可以獲取變量的地址。

inta=5; constintb=3.14; int*ipa=&a; constint*ipb=&b;//常量指針,指向常變量

int*constipc=&a;//指針常量,指針本身是常量注意:常數(shù)是不可尋址的,但常變量可以。

int*iptr=&23;//錯不能用一個整數(shù)給一個指針變量賦初值。

int*iptr=2345;//錯6.2.3間接引用指針“*”是乘法,又可以用于定義指針,還可以用于指針的間接引用(“*”的第三種用途)。

inta=4; int*ip=&a; cout<<*ip<<endl;//間接引用指針“*”放在可執(zhí)行語句中的指針之前,稱為間接引用操作符?!?”放在指針定義中時,稱為指針定義符。間接引用的指針既可用于右值,也可用于左值。 *ip=58; cout<<&ip<<endl;//輸出:58例:輸入a和b兩個整數(shù),按先大后小的順序輸出a和b(用指針變量處理)。#include<iostream>usingnamespacestd;intmain(){int*p1,*p2,*p,a,b;cin>>a>>b;//輸入兩個整數(shù)

p1=&a;//使p1指向ap2=&b;//使p2指向bif(a<b)//如果a<b就使p1與p2的值交換

{p=p1;//將p1的指向與p2的指向交換

p1=p2;p2=p;}cout<<"a="<<a<<"b="<<b<<endl;cout<<"max="<<*p1<<"min="<<*p2<<endl;return0;}6.2.4指針變量的地址指針也是變量,是變量就有內(nèi)存地址,所以指針也有地址。#include<iostream>usingnamespacestd;intmain(){inta=18;int*ip=&a;cout<<a<<endl;cout<<ip<<endl;cout<<&a<<endl;cout<<*ip<<endl;cout<<&ip<<endl;return0;}結(jié)果:180x22ff740x22ff74180x22ff70

6.2.5指針運(yùn)算指針可以進(jìn)行加減運(yùn)算。指針加減整數(shù)的操作表示空間位置上的挪動,但是挪動的字節(jié)數(shù)與其數(shù)據(jù)類型相關(guān): 對float指針加6實(shí)際增加了24個字節(jié)。 對longint指針加5實(shí)際增加了20個字節(jié)。 對char指針減7實(shí)際減少了7個字節(jié)。 對double指針減2實(shí)際減少了16個字節(jié)。同類型的指針可以相互賦值。6.2.6指針作為函數(shù)參數(shù)函數(shù)的參數(shù)不僅可以是整型、浮點(diǎn)型、字符型等數(shù)據(jù),還可以是指針類型。它的作用是將一個變量的地址傳送給被調(diào)用函數(shù)的形參。例:對輸入的兩個整數(shù)按大小順序輸出。要求用函數(shù)處理,而且用指針類型的數(shù)據(jù)作函數(shù)參數(shù)。#include<iostream>usingnamespacestd;voidswap(int*p1,int*p2);//函數(shù)的作用是將*p1的值與*p2的值交換intmain(){int*pointer1,*pointer2,a,b;cin>>a>>b;pointer1=&a;//使pointer1指向apointer2=&b;//使pointer2指向bif(a<b)//如果a<b,使*pointer1和*pointer2互換

swap(pointer1,pointer2);cout<<"max="<<a<<"min="<<b<<endl;return0;}voidswap(int*p1,int*p2){inttemp;temp=*p1;*p1=*p2;*p2=temp;}inttemp;temp=*p1;*p1=*p2;*p2=temp;50x23ff6ca80x23ff68bpointer1=&a;pointer2=&b;0x23ff6c0x23ff68pointer1pointer20x23ff6c0x23ff68p1p2swap(pointer1,pointer2);6.3數(shù)組與指針

6.3.1數(shù)組名有如下聲明:inta[5];我們把a(bǔ)稱為數(shù)組,它是一些值的集合。下標(biāo)和數(shù)組名一起使用,用于標(biāo)識該集合中的某個特定的值,如a[0]表示數(shù)組a的第1個值,a[4]表示第5個值。a[4]的類型是整型,但a的類型是什么?它所表示的又是什么?一個合乎邏輯的答案是a表示整個數(shù)組,但事實(shí)并非如此。在C/C++中,幾乎所有使用數(shù)組名的表達(dá)式里的數(shù)組名的值是一個指針常量,也就是數(shù)組第一個元素的地址。它的類型取決于數(shù)組元素的類型:如果它們是int類型,那么數(shù)組名的類型就是“指向int的指針常量”——即“int*”。例:#include<iostream>usingnamespacestd;intmain(){inta[5]={1,2,3,4,5};intb=a;}注意:只有當(dāng)數(shù)組名在表達(dá)式中使用時,編譯器才為它產(chǎn)生一個指針常量,不要理解為數(shù)組名就是指針。編譯錯誤:invalidconversionfrom`int*'to`int'只有在兩種場合下,數(shù)組名不用指針常量來表示——就是當(dāng)數(shù)組名作為sizeof操作符或單目操作符&的操作數(shù)時。對于inta[5];sizeof(a)→返回整個數(shù)組的長度&a→返回一個指向數(shù)組a的指針,類型為int(*)[5],

即指向有5個整型元素的一維數(shù)組的指針。由上面也可看出,數(shù)組名并非就是指針。6.3.2下標(biāo)操作符—[][]實(shí)際上是變址運(yùn)算符。程序編譯時,C++編譯系統(tǒng)會將其轉(zhuǎn)換為*(x+i)的形式,x表示[]前的操作數(shù)。如

a[i]→*(a+i)

也就是說下標(biāo)操作其實(shí)進(jìn)行的就是指針運(yùn)算,即將數(shù)組首元素的地址加上相對位移量,然后取該單元中的內(nèi)容。同理

b[i][j]→*(b[i]+j)→*(*(b+i)+j)

其含義后再討論。6.3.3用指針操作數(shù)組前面講了,一維數(shù)組a在表達(dá)式中值為數(shù)組首元素的地址,類型為int*,而a[i]等同*(a+i),那么下面幾個操作等價就很好理解了。inta[5];int*p=a;//a、p類型一致①a[i]②*(a+i)③p[i]④*(p+i)也就是說我們可以定義一個和數(shù)組首元素類型一致的指針變量來操作數(shù)組。相應(yīng)地第i+1個元素的地址: ①&a[i] ②a+i ③p+i ④&p[i]注意:

a++;//× p++;//√例:數(shù)組的求和#include<iostream>usingnamespacestd;intmain(){intsum1=0,sum2=0,sum3=0,sum4=0,sum5=0;inta[]={1,4,5,7,9,2};int*p=a;intsize=sizeof(a)/sizeof(a[0]);//數(shù)組元素的個數(shù)

for(inti=0;i<size;++i)//方法1{sum1+=a[i];}for(inti=0;i<size;++i)//方法2{sum2+=p[i];}for(inti=0;i<size;++i)//方法3{sum3+=*(p++);}

p=a;for(inti=0;i<size;++i)//方法4{sum4+=*(p+i);}for(inti=0;i<size;++i)//方法5{sum5+=*(a+i);}cout<<sum1<<""<<sum2<<""<<sum3<<""<<sum4<<""<<sum5<<endl;return0;}6.3.2用指針變量作函數(shù)參數(shù)接收數(shù)組地址前面已經(jīng)多次強(qiáng)調(diào):數(shù)組名代表數(shù)組首元素的地址。用數(shù)組名作函數(shù)的參數(shù),傳遞的是數(shù)組首元素的地址。很容易推想:用指針變量作函數(shù)形參,同樣可以接收從實(shí)參傳遞來的數(shù)組首元素的地址。例:將10個整數(shù)按由小到大的順序排列。#include<iostream>usingnamespacestd;voidselect_sort(int*p,intn);intmain(){

inta[10];cout<<"entertheoriginlarray:"<<endl;for(inti=0;i<10;i++)//輸入10個數(shù)

cin>>a[i];cout<<endl;

select_sort(a,10);//函數(shù)調(diào)用,數(shù)組名作實(shí)參

cout<<"thesortedarray:"<<endl;for(inti=0;i<10;i++)//輸出10個已排好序的數(shù)

cout<<a[i]<<"";cout<<endl;return0;}voidselect_sort(int*p,intn)//用指針變量作形參{intk,t;for(inti=0;i<n-1;i++){k=i;for(intj=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ù)組與指針C++語言實(shí)際上是把多維數(shù)組當(dāng)成一維數(shù)組來處理的。比如,現(xiàn)在有一個int型的二維數(shù)組a[3][4],計(jì)算機(jī)認(rèn)為這是一個一維的數(shù)組a[3],數(shù)組的三個元素分別是a[0]、a[1]和a[2]。其中每個元素又是一個一維數(shù)組,例如a[0]又是一個包含a[0][0],a[0][1],a[0][2]和a[0][3]共4個元素的數(shù)組。如果我們要引用數(shù)組元素a[1][2],可以首先根據(jù)下標(biāo)1找到a[1],然后在a[1]中找到第3個元素a[1][2]。inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};123456789101112a[0]a[1]a[2]aa在表達(dá)式中的值為數(shù)組首元素的地址。a的類型取決于數(shù)組元素的類型,而數(shù)組a的元素為包含4個整型元素的一維數(shù)組,則a的類型為指向包含4個整型元素的一維數(shù)組的指針——int(*)[4]a+1數(shù)組a的第2個元素(子數(shù)組)的地址。*(a+1)即a[1],第2個子數(shù)組的“數(shù)組名”。注:子數(shù)組的數(shù)組名其實(shí)并不存在,*(a+1)實(shí)際上返回一個指向第2個子數(shù)組首元素的指針,類型為int*,這與數(shù)組名在概念上是一致的,為便于理解,可以認(rèn)為a[1]是第2個子數(shù)組的數(shù)組名。*(a+1)+1第2個子數(shù)組第2個元素的地址。*(*(a+1)+1)即a[1][1],第2個子數(shù)組第2個元素的值。例:輸出二維數(shù)組各元素的值。#include<iostream>usingnamespacestd;intmain(){inta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};int*p;//p是基類型為整型的指針變量

for(p=a[0];p<a[0]+12;p++)cout<<*p<<"";cout<<endl;return0;}for(p=a;......對不對?例:輸出二維數(shù)組任一行任一列元素的值。#include<iostream>usingnamespacestd;intmain(){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;//a的類型也為int(*p)[4]cout<<*(*(p+i)+j)<<endl;return0;}例:輸出二維數(shù)組各元素的值。用一個函數(shù)實(shí)現(xiàn)輸出#include<iostream>usingnamespacestd;voidoutput(int(*p)[4]);intmain(){inta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};output(a);//多維數(shù)組名作函數(shù)參數(shù)

return0;}voidoutput(int(*p)[4])//形參是指向一維數(shù)組的指針變量{inti,j;for(i=0;i<3;i++){for(j=0;j<4;j++)cout<<*(*(p+i)+j)<<"";cout<<endl;}}此函數(shù)的形參是否合適,怎么改進(jìn)?#include<iostream>#include<iomanip>voidoutput(int(*p)[4],int);intmain(){inta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};output(a,3);//多維數(shù)組名作函數(shù)參數(shù)

return0;}voidoutput(int(*p)[4],intn)//形參是指向一維數(shù)組的指針變量{intm=sizeof(p[0])/sizeof(p[0][0]);inti,j;for(i=0;i<n;i++){for(j=0;j<m;j++)cout<<setw(6)<<*(*(p+i)+j);cout<<endl;}cout<<endl;}6.4字符串與指針在C++中可以用3種方法訪問一個字符串。1.用字符數(shù)組存放一個字符串定義一個字符數(shù)組并初始化,然后輸出其中的字符串。#include<iostream>usingnamespacestd;intmain(){charstr[]="IloveCHINA!";cout<<str<<endl;return0;}2.用string變量存放字符串定義一個字符串變量并初始化,然后輸出其中的字符串。#include<string>#include<iostream>usingnamespacestd;intmain(){stringstr="IloveCHINA!";cout<<str<<endl;return0;}3.用字符指針指向一個字符串定義一個字符指針變量并初始化,然后輸出它指向的字符串。#include<iostream>usingnamespacestd;intmain(){char*str="IloveCHINA!";cout<<str<<endl;return0;}對字符串中字符的存取,可以用下標(biāo)方法,也可以用指針方法。例:將字符串str1復(fù)制給字符串str2。定義兩個字符數(shù)組str1和str2,再設(shè)兩個指針變量p1和p2,分別指向兩個字符數(shù)組中的有關(guān)字符,通過改變指針變量的值使它們指向字符串中的不同的字符,以實(shí)現(xiàn)字符的復(fù)制。#include<iostream>usingnamespacestd;intmain(){charstr1[]="IloveCHINA!",str2[20],*p1,*p2;p1=str1;p2=str2;for(;*p1!='\0';p1++,p2++)*p2=*p1;

*p2='\0';p1=str1;p2=str2;cout<<"str1is:"<<p1<<endl;cout<<"str2is:"<<p2<<endl;return0;}6.5函數(shù)與指針

6.5.1用函數(shù)指針變量調(diào)用函數(shù)指針變量也可以指向一個函數(shù)。一個函數(shù)在編譯時被分配給一個入口地址。這個函數(shù)入口地址就稱為函數(shù)的指針??梢杂靡粋€指針變量指向函數(shù),然后通過該指針變量調(diào)用此函數(shù)。指向函數(shù)的指針變量的一般定義形式為

函數(shù)類型(*指針變量名)(函數(shù)形參表);例:求a和b中的大者。#include<iostream>usingnamespacestd;intmax(intx,inty);//函數(shù)聲明intmain(){

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

p=max;//使p指向函數(shù)maxcin>>a>>b;m=p(a,b);cout<<"max="<<m<<endl;return0;}賦值語句“p=max;”的作用是將函數(shù)max的入口地址賦給指針變量p。這時,p才指向函數(shù)max。intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}*6.5.2用指向函數(shù)的指針作函數(shù)參數(shù)程序例見教材P1876.6返回指針值的函數(shù)一個函數(shù)可以返回一個整型值、字符值、實(shí)型值等,也可以返回指針型的數(shù)據(jù),即地址。返回指針值的函數(shù)簡稱為指針函數(shù)。定義指針函數(shù)的一般形式為

類型名*函數(shù)名(參數(shù)表列);例如int*a(intx,inty);#include<iostream>usingnamespacestd;int*fun();intmain(){int*p;p=fun();cout<<*p<<endl;return0;}int*fun(){inta=8;return&a;}此程序有問題嗎?6.7指針數(shù)組和指向指針的指針

6.7.1指針數(shù)組的概念如果一個數(shù)組,其元素均為指針類型數(shù)據(jù),該數(shù)組稱為指針數(shù)組,也就是說,指針數(shù)組中的每一個元素相當(dāng)于一個指針變量,它的值都是地址。一維指針數(shù)組的定義形式為

類型名*數(shù)組名[數(shù)組長度];例如

int*p[4];可以用指針數(shù)組中各個元素分別指向若干個字符串,使字符串處理更加方便靈活。例:若干字符串按字母順序(由小到大)輸出。#include<iostream>#include<cstring>usingnamespacestd;voidsort(char*[],intn);voidPrint(char*[],intn);intmain(){constintn=5;

char*name[n]={"BASIC","FORTRAN","C++","Pascal","COBOL"};sort(name,n);Print(name,n);return0;}voidsort(char*name[],intn){char*temp;intk;for(inti=0;i<n-1;i++){k=i;for(intj=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;}}}voidPrint(char*name[],intn){for(inti=0;i<n;i++)cout<<name[i]<<endl;}6.7.2指向指針的指針上一例中,name是一個指針數(shù)組,它的每一個元素是一個指針型數(shù)據(jù)(其值為地址),分別指向不同的字符串。數(shù)組名name代表該指針數(shù)組首元素的地址,其類型是char**。(數(shù)組首元素的類型為指向char類型數(shù)據(jù)的指針,則name為指向char類型數(shù)據(jù)的指針的指針。)可以設(shè)置一個指針變量p,它指向指針數(shù)組的元素。p就是指向指針型數(shù)據(jù)的指針變量。p的定義如下:

char*(*p);由于*運(yùn)算符的結(jié)合性是從右到左,因此“char*(*p);”可寫成

char**p;例:指向字符型數(shù)據(jù)的指針變量。#include<iostream>usingnamespacestd;intmain(){

char**p;//定義指向字符指針數(shù)據(jù)的指針變量pchar*name[]={"BASIC","FORTRAN","C++",

溫馨提示

  • 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

提交評論