版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第5章 指針的應(yīng)用§5.1、指針概述 一、內(nèi)存地址的概念
二、從內(nèi)存單元中存取數(shù)據(jù)的方法
1、通過變量名,稱為直接訪問方式,直接對(duì)變量的存儲(chǔ)單元進(jìn)行存取訪問。在變量獲得內(nèi)存空間的同時(shí),變量名也就成為了相應(yīng)內(nèi)存空間的名稱,在變量的整個(gè)生存期內(nèi)都可以用這個(gè)名字訪問該內(nèi)存空間,表現(xiàn)在程序語句中就是通過變量名存取變量內(nèi)容。 2023/7/111C++指針的運(yùn)用
2、通過地址,稱為間接訪問方式,先找到存放變量的地址的變量,得到變量的地址,再根據(jù)變量的地址找到變量的存儲(chǔ)單元,對(duì)它進(jìn)行存取訪問。
C++擁有在運(yùn)行時(shí)獲得變量的地址和操縱地址的能力。變量的地址可以使用地址運(yùn)算符&求得,在某一變量前加上地址運(yùn)算符&,則為該變量的地址,如:
&x 表示變量x的地址 數(shù)組名表示數(shù)組的首地址;函數(shù)的地址用函數(shù)名表示。 用來存放地址的變量就叫做指針型變量,簡稱指針。
2023/7/112C++指針的運(yùn)用
假設(shè)ptr為一指針,則語句:
ptr=&x;
就將變量x的地址存入了指針ptr中。 也經(jīng)常簡稱為“指針ptr指向變量x”。 可以通過指針得到變量x的值或改變變量x的值: *ptr=2; //相當(dāng)于 x=2 y=*ptr; //將x的值賦給y2023/7/113C++指針的運(yùn)用
例5.1、閱讀如下程序:源程序清單:#include<iostream>usingnamespacestd;voidmain(){ inta; int*p; a=10; p=&a; cout<<"a的值表示方法1:"<<a<<endl; cout<<"a的值表示方法2:"<<*p<<endl; cout<<"a的地址表示方法1:"<<&a<<endl; cout<<"a的地址表示方法2:"<<p<<endl;}2023/7/114C++指針的運(yùn)用§5.2、指針變量的定義、賦值及使用 一、指針變量的定義 指針本身也是一種變量,須先聲明后使用。 聲明指針類型的變量是在聲明變量的同時(shí)加上*來完成的。對(duì)應(yīng)于各種類型的數(shù)據(jù)都有相應(yīng)的指針類型。 *放在指針定義中時(shí),被稱為指針定義符。 放在可執(zhí)行語句中的指針前被稱為指針運(yùn)算符,也稱為“間接訪問”運(yùn)算符。2023/7/115C++指針的運(yùn)用
指針變量的聲明語句,由數(shù)據(jù)類型后跟星號(hào),再跟隨指針變量名組成。 數(shù)據(jù)類型*指針變量名; 如: int*iptr; int*iptr; int*iptr; int*iptr;
在指針定義中,一個(gè)*只能表示一個(gè)指針。
int*iptr1,iptr2; //iptr1—指針變量,iptr2整型變量
int*iptr1,*iptr2; //兩個(gè)指針變量2023/7/116C++指針的運(yùn)用
地址和指針的關(guān)系
intx,*ptr; x=3;ptr=&x;
如果ptr指向x,那么*ptr的值為x的值,以后對(duì)*ptr的賦值等價(jià)于對(duì)x的賦值。
#include<iostream> usingnamespacestd; voidmain() { intx=3,*ptr; ptr=&x; *ptr=11; cout<<x<<endl; //x=11 }2023/7/117C++指針的運(yùn)用
二、指針變量的賦值 與變量定義一樣,定義好指針變量后也可以對(duì)它進(jìn)行初始化,指針變量可以初始化為0、NULL或一個(gè)地址。數(shù)值為0或者NULL的指針不指任何內(nèi)容。數(shù)值0是可以直接賦給指針變量的唯一整數(shù)值。
1.在定義指針變量的同時(shí)進(jìn)行初始化賦值,一般格式如下:數(shù)據(jù)類型*指針名=初始地址;2023/7/118C++指針的運(yùn)用 2.定義指針變量后,用賦值語句將其初始化。 指針變量名=地址; 可以是變量的地址、數(shù)組名、函數(shù)名等。 用變量地址作為初值時(shí),該變量的定義必須在指針初始化之前定義。 不能把常量或表達(dá)式的地址賦給指針變量。 不能將一個(gè)非0整數(shù)直接賦給指針變量,但可以賦整數(shù)值0,表示該指針為空指針。 例如:int*p;p=0;p為空指針,不指向任何地址。2023/7/119C++指針的運(yùn)用 3.允許聲明指向void類型的指針,該指針可以被賦予任何類型對(duì)象的地址。 例如:
void*general;int*point;inti;general=&i;point=(int*)general;2023/7/1110C++指針的運(yùn)用
例5.2、閱讀如下程序:源程序清單:#include<iostream>usingnamespacestd;voidmain(){ intx; int*p; int*q; inta=3; int*pa=&a; p=&x; q=p; cout<<*pa<<endl;}2023/7/1111C++指針的運(yùn)用#include<iostream>usingnamespacestd;voidmain(){ intx=3,*ptr=&x; *ptr=52; cout<<x<<endl; //52 cout<<*ptr<<endl;//52 cout<<ptr<<endl; //變量x的地址
cout<<&x<<endl; //變量x的地址}2023/7/1112C++指針的運(yùn)用
三、指針變量的使用 例5.3、閱讀如下程序:源程序清單:#include<iostream>usingnamespacestd;voidmain(){ intx,*p; p=&x; cin>>*p; cout<<*p<<endl;}2023/7/1113C++指針的運(yùn)用
指針在使用前要進(jìn)行初始化或賦值,指針未賦值將非常危險(xiǎn)。
#include<iostream> usingnamespacestd; voidmain() { intx=26; int*ptr; *ptr=58; //此時(shí)ptr是一個(gè)隨機(jī)地址
cout<<x<<endl; }
很可能已經(jīng)破壞了另一變量的值,甚至修改了函數(shù)的返回地址等。2023/7/1114C++指針的運(yùn)用§5.3、簡單變量與指針 指針的類型是它所指向變量的類型。指針值不是整型數(shù),在使用中必須類型匹配。如:intx=26; int*ptr=&x; //定義指針變量*ptr=&x; //error:不能將整型地址轉(zhuǎn)換成整型數(shù)*ptr=50; //執(zhí)行語句:*在此處作間接引用 可以對(duì)不同的類型作強(qiáng)制轉(zhuǎn)換,如: *ptr=(int)&x;
表示將變量x的地址值作為一個(gè)整型數(shù)賦給變量*ptr,即變量x。2023/7/1115C++指針的運(yùn)用
因?yàn)橹羔樖怯蓄愋偷?,所以給指針賦值不但要是一個(gè)地址,而且應(yīng)該是一個(gè)與該指針類型相符的變量的地址?;蛘哒f指針的類型是它所指向變量的類型。
floatf=34.5, *fptr=&f; //浮點(diǎn)指針
int*iptr=&f; //error:浮點(diǎn)變量地址賦給整型指針
iptr=fptr; //error:浮點(diǎn)指針賦給整型指針 將一個(gè)指針賦值給另一個(gè)指針,結(jié)果是兩個(gè)指針指向一個(gè)相同的地址單元。 2023/7/1116C++指針的運(yùn)用
例5.4、閱讀如下程序:源程序清單:#include<iostream>usingnamespacestd;voidmain(){ intx,*p;x=3;p=&x; *p=*p+10;cout<<*p<<endl;}2023/7/1117C++指針的運(yùn)用
例5.5、輸入a和b兩個(gè)整數(shù),運(yùn)用指針技術(shù)按先大后小的順序輸出a和b。源程序清單:#include<iostream>#include<iomanip>usingnamespacestd;voidmain(void){ //利用間接訪問方式來操作2023/7/1118C++指針的運(yùn)用 inta,b; int*p1=&a; int*p2=&b; cout<<"inputaandb:"<<endl; cin>>*p1>>*p2; if(*p1<*p2)cout<<"按先大后小的順序輸出的a和b為:"<<*p2<<setw(4)<<*p1<<endl;elsecout<<"按先大后小的順序輸出的a和b為:"<<*p1<<setw(4)<<*p2<<endl;}2023/7/1119C++指針的運(yùn)用
指針變量的運(yùn)算 指針的算術(shù)運(yùn)算 指針加一,減一運(yùn)算 是指向下一個(gè)或前一個(gè)數(shù)據(jù)。如:y=*px++相當(dāng)于y=*(px++)//px為一指針 指針與整數(shù)的加減運(yùn)算 指針p加上或減去n,其意義是指針當(dāng)前指向位置的前方或后方第n個(gè)數(shù)據(jù)的地址。 這種運(yùn)算的結(jié)果值取決于指針指向的數(shù)據(jù)類型。2023/7/1120C++指針的運(yùn)用pa-2pa-1pa+1pa+2pa+3*(pa-2)*pa*(pa+1)*(pa+2)*(pa+3)*(pa-1)short*pa2023/7/1121C++指針的運(yùn)用pb-1pbpb+1pb+2*(pb-1)*pb*(pb+1)*(pb+2)int*pb2023/7/1122C++指針的運(yùn)用#include<iostream>usingnamespacestd;voidmain(){ intn=20,*ptr=&n,*ptr1,y; y=*ptr; cout<<"ptr="<<ptr<<'\t'<<"y="<<y<<endl; y=*(ptr++); //y=*(++ptr); cout<<"ptr="<<ptr<<'\t'<<"y="<<y<<endl; ptr1=ptr+3; y=*ptr1; cout<<"ptr="<<ptr1<<'\t'<<"y="<<y<<endl;}2023/7/1123C++指針的運(yùn)用
關(guān)系運(yùn)算 表示所指變量在內(nèi)存中的位置關(guān)系 如:兩個(gè)指針變量指向同一個(gè)數(shù)組中的元素時(shí),其關(guān)系運(yùn)算的結(jié)果表明了這兩個(gè)指針變量所指向的數(shù)組元素的先后關(guān)系
chara[10];
char*p1,*p2;
p1=a+2;
p2=a+4;
p1++;p2--; 指針可以和零之間進(jìn)行等于或不等于的關(guān)系運(yùn)算。 例如:p==0; //表示空指針
2023/7/1124C++指針的運(yùn)用
例5.5、編寫一交換兩個(gè)整型變量值的函數(shù),并寫一主函數(shù)測試。
#include<iostream>usingnamespacestd; voids*x,int*y) { intt; t=*x,*x=*y,*y=t; } voidmain() { inta=1,b=2; cout<<"交換前:a="<<a<<",b="<<b<<endl; s); cout<<"交換后:a="<<a<<",b="<<b<<endl; } 2023/7/1125C++指針的運(yùn)用§5.4、一維數(shù)組與指針 數(shù)組名可以拿來初始化指針,數(shù)組名就是數(shù)組第一個(gè)元素的地址,即對(duì)于數(shù)組a,有a=&a[0]。 假設(shè)按下面定義數(shù)組a及指針iptr:
inta[10],*iptr=a;
對(duì)第i個(gè)元素可表示成以下四種:
a[i]、*(a+i)、iptr[i]、*(iptr+i)
這四個(gè)等價(jià)關(guān)系使得數(shù)組與指針相互轉(zhuǎn)換非常靈活。2023/7/1126C++指針的運(yùn)用
與上面相對(duì)應(yīng)的有下面四個(gè)地址等價(jià)關(guān)系:
&a[i] a+i iptr+i &iptr[i] a+i表示第i個(gè)數(shù)組元素的地址,iptr+i也同樣是指向數(shù)組a的第i個(gè)數(shù)組元素。相互等價(jià)2023/7/1127C++指針的運(yùn)用
例5.6、求數(shù)組元素的和#include<iostream>usingnamespacestd;intsum1,sum2,sum3,sum4,sum5,*iPtr;intiArray[]={1,4,2,7,13,32,21,48,16,30};voidmain(){ intsize,n;size=sizeof(iArray)/sizeof(*iArray); //sizeof(iArray):數(shù)組iArray所占字節(jié)數(shù)
//sizeof(*iArray):數(shù)組元素類型所占字節(jié)數(shù)
for(n=0;n<size;n++)sum1+=iArray[n];//方法12023/7/1128C++指針的運(yùn)用 iPtr=iArray; //方法2 for(n=0;n<size;n++)sum2+=*iPtr++; iPtr=iArray; //方法3 for(n=0;n<size;n++)sum3+=*(iPtr+n); iPtr=iArray; //方法4 for(n=0;n<size;n++)sum4+=iPtr[n]; //方法5 for(n=0;n<size;n++)sum5+=*(iArray+n); cout<<"sum1="<<sum1<<",sum2="<<sum2\ <<",sum3="<<sum3<<",sum4="<<sum4\ <<",sum5="<<sum5<<endl;}2023/7/1129C++指針的運(yùn)用
例5.7、閱讀如下程序:源程序清單:#include<iostream>usingnamespacestd;voidmain(){chara[10]="abcdefghi";char*p1,*p2; p1=a;p1+=2;2023/7/1130C++指針的運(yùn)用
p2=a+4;//指針變量p2,直接由數(shù)組名加上4,指向數(shù)組的第五個(gè)數(shù)組元素的內(nèi)存單元
if(p1<p2)cout<<"p1所指向的數(shù)組元素在p2所指向的數(shù)組元素前面!"<<endl;elsecout<<"p1所指向的數(shù)組元素在p2所指向的數(shù)組元素后面!"<<endl;p1++;p2--;if(p1==p2)cout<<"p1和p2同時(shí)指向數(shù)組中的同一個(gè)元素且元素值為:"<<*p1<<endl;elsecout<<"p1和p2沒有指向數(shù)組中的同一個(gè)元素!"<<endl;}2023/7/1131C++指針的運(yùn)用
例5.8、利用指針技術(shù),將鍵盤輸入的N個(gè)整數(shù)按相反的順序存放并輸出。 思路分析: 分別取出數(shù)組最前面和最后面的元素,進(jìn)行交換,即a[0]與a[N-1]交換;然后再分別取出a[1]與a[N-2]交換;直到交換完畢。2023/7/1132C++指針的運(yùn)用源程序清單:#include<iostream>#include<iomanip>usingnamespacestd;intmain(void){ inta[10],i,j,temp,*p; cout<<"Inputteninterger:"<<endl; for(p=a;p<a+10;p++) cin>>*p;p=a;2023/7/1133C++指針的運(yùn)用
for(i=0,j=10-1;i<j;i++,j--){ temp=*(p+i); *(p+i)=*(p+j); *(p+j)=temp;} for(p=a;p<a+10;p++) cout<<setw(4)<<*p;cout<<endl;return0;}2023/7/1134C++指針的運(yùn)用
例5.9、把一個(gè)整數(shù)插入到一個(gè)由小到大的有序整數(shù)序列中,并仍然保持由小到大的順序。 設(shè)有10個(gè)整數(shù)按由小到大的順序存放在數(shù)組a中,待插入的數(shù)放在變量x中。
#include<iostream> #include<iomanip> usingnamespacestd; voidmain(void) { constintN=10; inta[N+1],p,x,*t;2023/7/1135C++指針的運(yùn)用 cout<<"輸入a數(shù)組:"<<endl; for(t=a;t<a+N;t++) cin>>*t; cout<<"輸入待插入的數(shù)x:"<<endl; cin>>x; t=a;p=0; while(x>*(t+p)&&p<N) p++; for(t=a+N-1;t>=a+p;t--) *(t+1)=*t; t=a+p; *t=x; for(t=a;t<=a+N;t++) cout<<setw(3)<<*t; cout<<endl;}2023/7/1136C++指針的運(yùn)用
例5.10、從鍵盤輸入整數(shù)集合a、b的元素個(gè)數(shù)和各個(gè)元素的值(不相同),計(jì)算并輸出其交集。#include<iostream>usingnamespacestd;#include<iomanip>voidmain(void){ constintM=20,N=10; inta[M],b[N],c[M]; intd,e,f=0,*pa,*pb,*pc;2023/7/1137C++指針的運(yùn)用 cout<<"輸入數(shù)組a中元素的個(gè)數(shù):"<<endl; cin>>d; cout<<"輸入數(shù)組a的"<<d<<"個(gè)元素:"<<endl; for(pa=a;pa<a+d;pa++) cin>>*pa; cout<<"輸入數(shù)組b中元素的個(gè)數(shù):"<<endl; cin>>e; cout<<"輸入數(shù)組b的"<<e<<"個(gè)元素:"<<endl; for(pb=b;pb<b+e;pb++) cin>>*pb;2023/7/1138C++指針的運(yùn)用 for(pa=a,pc=c;pa<a+d;pa++)for(pb=b;pb<b+e;pb++) if(*pa==*pb) {*pc++=*pa; f++; break;} cout<<"交集c的各個(gè)元素依次為:"<<endl; for(pc=c;pc<c+f;pc++) cout<<setw(3)<<*pc; cout<<endl;}2023/7/1139C++指針的運(yùn)用
例5.11、從鍵盤輸入整數(shù)集合a、b的元素個(gè)數(shù)和各個(gè)元素的值(不相同),計(jì)算并輸出其并集。#include<iostream>usingnamespacestd;#include<iomanip>voidmain(void){ constintM=20,N=10; inta[M],b[N],c[M+N]; intd,e,f=0,*pa,*pb,*pc;2023/7/1140C++指針的運(yùn)用 cout<<"輸入數(shù)組a中元素的個(gè)數(shù):"<<endl; cin>>d; cout<<"輸入數(shù)組a的"<<d<<"個(gè)元素:"<<endl; for(pa=a;pa<a+d;pa++) cin>>*pa; cout<<"輸入數(shù)組b中元素的個(gè)數(shù):"<<endl; cin>>e; cout<<"輸入數(shù)組b的"<<e<<"個(gè)元素:"<<endl; for(pb=b;pb<b+e;pb++) cin>>*pb;2023/7/1141C++指針的運(yùn)用 for(pa=a,pc=c;pa<a+d;pa++,pc++) {*pc=*pa;f++;} for(pb=b;pb<b+e;pb++) { for(pa=a;pa<a+d;pa++) if(*pb==*pa) break; if(pa>=a+d) {*pc++=*pb;f++;} } cout<<“并集c的各個(gè)元素依次為:"<<endl; for(pc=c;pc<c+f;pc++) cout<<setw(3)<<*pc; cout<<endl;}2023/7/1142C++指針的運(yùn)用
例5.12、編程實(shí)現(xiàn)將一個(gè)數(shù)組中的數(shù)據(jù)按相反順序存放。思路分析:用一個(gè)子函數(shù)實(shí)現(xiàn)按相反順序存放,主函數(shù)調(diào)用該子函數(shù)實(shí)現(xiàn)按相反順序存放。#include<iostream>usingnamespacestd;voidinvert(int*p,intn){inti,j,temp;for(i=0,j=n-1;i<j;i++,j--){ temp=*(p+i); *(p+i)=*(p+j); *(p+j)=temp;}}2023/7/1143C++指針的運(yùn)用intmain(void){inta[10],i;cout<<"Inputteninterger:"<<endl;for(i=0;i<10;i++) cin>>a[i];invert(a,10);for(i=0;i<10;i++) cout<<a[i]<<endl;return0;}2023/7/1144C++指針的運(yùn)用§5.5、二維數(shù)組與指針 例5.13、利用指針技術(shù),輸出如下二維數(shù)組各元素的值。
inta[3][4]= {1,2,3,4,5,6,7,8,9,10,11,12}
源程序清單1:#include<iostream>#include<iomanip>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 文化創(chuàng)意街區(qū)發(fā)展趨勢-洞察分析
- 2024年柳州工程機(jī)械集團(tuán)職工醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點(diǎn)附帶答案
- 關(guān)于車庫安裝充電樁的協(xié)議書(2篇)
- 專題09 閱讀理解(應(yīng)用文記敘文)【考題猜想】-七年級(jí)英語上學(xué)期期末考點(diǎn)大串講(滬教版2024)(解析版)
- 2025年牛津上海版九年級(jí)地理上冊(cè)階段測試試卷
- 《如何支持成本管理》課件
- 2024年華東師大版九年級(jí)歷史上冊(cè)月考試卷含答案
- 2024年北師大版八年級(jí)生物上冊(cè)月考試卷含答案
- 風(fēng)力發(fā)電設(shè)備運(yùn)輸協(xié)議
- 創(chuàng)業(yè)指導(dǎo)教練員招聘協(xié)議樣本
- 基本光刻工藝流程
- 胸腔閉式引流護(hù)理-2023年中華護(hù)理學(xué)會(huì)團(tuán)體標(biāo)準(zhǔn)
- 高中體育足球教學(xué)教案 全冊(cè)
- 藝術(shù)概論P(yáng)PT完整全套教學(xué)課件
- 社團(tuán)啦啦操訓(xùn)練計(jì)劃
- 2023-2024學(xué)年四川省雅安市小學(xué)語文二年級(jí)期末評(píng)估試題詳細(xì)參考答案解析
- UPS維護(hù)保養(yǎng)檢查表
- 英語人教新目標(biāo)七年級(jí)上冊(cè)微課PPT
- 2023年安全生產(chǎn)先進(jìn)集體申報(bào)表
- 碼頭裝卸作業(yè)風(fēng)險(xiǎn)辨識(shí)表
- 國家電網(wǎng)安全生產(chǎn)典型違章300條(含扣分)
評(píng)論
0/150
提交評(píng)論