




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
大學C++程序設計教程0第7章指針本章目標掌握指針的概念和定義方法。掌握指針的操作符和指針的運算掌握指針與數組的關系。掌握指針與字符串的關系。掌握new和delete操作符作用和使用方法。學會使用VisualC++幫助系統授課內容7.1地址與指針7.2指針運算7.3指針與數組7.4動態存儲分配7.5指針數組7.6指向指針的指針7.7結構體與指針7.8指針的初始化7.1地址與指針地址的概念什么是地址?如何表示地址?變量a的地址記作:&a;指針的概念什么是指針?指針如何表示?指針是C++語言具有代表性特征的功能之一,利用指針可以直接對內存中不同數據類型的數據進行快速處理,并且它為函數中各種數據的傳遞提供了簡潔便利的方法。指針是與計算機系統內部密切相關的一種處理形式,因此正確熟練的使用指針可以編制出簡潔明快、性能高、質量好的程序。指針變量——專門存放另一變量的地址?!?6781516………A公司B公司C公司一排平房叫地址在C語言中還存在一種特殊的變量,它同普通變量不同之處在于其存儲空間中存放的不是一般數據,而是地址。內存管理…1000……shorta;floatb;10012002200320002001a的地址b的地址取得變量、數組、函數地址的方法計算機的內存儲器就象一個一維數組,每個數組元素就是一個存儲單元。地址是存放信息數據的內存單元的編號。程序中定義的任何變量、數組或函數等,在編譯時都會在內存中分配一個確定的地址單元。C規定:變量的地址:可以用取地址運算符‘&’來獲取數組的地址:可以用數組名表示函數的地址:可以用函數名表示指針的聲明聲明的一般格式: 數據類型*指針變量名;舉例:
int*ptr; float*array; char*s1,*s2;指針類型內存地址值是固定不變的,不同類型的指針本身所占據的存儲區域都一樣大。規定了用指針間接訪問數據時的訪問方式為指針的算術運算提供依據指針聲明的舉例指針在定義后必須初始化才能使用;否則,結果不確定。指針初始化的一般格式:指針變量名=數據對象;數據對象可以是變量、數組、函數、結構等。舉例:int*ptr,i=10;ptr=&i; //指向單個變量char*sp=“string”; //指向字符串inta[5],*ap;ap=a; //指向數組intmax(),(*fp)();fp=max; //指向函數圖7.1存儲結構簡圖9.2指針的運算指針運算是以指針變量所持有的地址值為運算量進行的運算。因此指針運算的實質是地址的運算、指針的運算與普通變量的運算在種類和意義上都是不同的。其種類有限只能進行。1.“*”和“&”運算符2.指針變量算術運算3.指針變量比較運算4.指針變量下標運算1.“*”和“&”運算符“&”稱為取地址運算符,用以返回變量的指針,即變量的地址;“*”稱為指針運算符,用以返回指針所指向的基類型變量的值。設某個指針變量名字是px,同時存在另一個名字為x的普通變量,當px得到x的存儲地址時(px=&x),我們稱指針px指向x的內存區域,同時可以用px對x進行加工處理。指針指向的內存區域中的數據稱為指針的目標變量,目標變量用指針名前加*號表示“*”和“&”運算符【例】指針變量的定義和引用示例inta;
int*p;
p=&a;
*p=5;
cout<<a<<endl;
ap&a*p5輸出5請思考:inta;
int*p;
p=&a;
*p=5;
ap5若已有:int*w;w要使w也指向a應如何操作?w=&a;或w=p;請思考:inta;
int*p;
w=p=&a;
*p=5;
ap5int*w;w要使a的值增1,應如何操作?a=a+1;或*p=*p+1;或*w=*w+1;*p*winta;
int*p;
w=p=&a;
*p=5;
ap5int*w;wa=a+1;或*p=*p+1;或*w=*w+1;*p*w等價于int*p,*w;間接運算符取地址運算符直接存取間接存取例如main(){floata,b=6.0,*p,*q;p=&a;cin>>p;*p=*p+2;q=p;p=&b;cout<<*q<<“,”<<*p;}6.0abqpfloata,b=6.0,*p,*q;p=&a;*pcin>>p;1.01.0*p=*p+2;3.0q=p;*qp=&b;*pcout<<*q<<“,”<<*p;輸出:3.000000,6.000000指針變量的使用1.數值的傳遞:(1)直接賦值:y=x;(2)使用指針賦值:px=&x;y=*px;x數據y數據px數據y數據x數據*px2.指針傳遞(1)一個指針轉給另一個指針:px=ps;(2)指針交換:p=ps;ps=pt;pt=p;ps&xpx&xx數據非法使用指針示例#include<stdio.h>main(){int*p,a=1;float*q;*p=5;q=&a;cout<<p<<“,”<<*p<<“,”<<*q<<“,”<<*q<<endl;}例9.1交換兩個變量的值算法:交換兩個變量x和y的值一定要用到第三個變量t作為周轉:
t=x;x=y;y=t;實參與形參有3種結合方式: 值調用、地址調用和引用調用例9.1交換兩個變量的值voidswap(intx,inty){inttmp;tmp=x;x=y;y=tmp;}voidmain(){intx=2,y=3;cout<<“x=“<<x<<“,y=“<<y<<endl; swap(x,y); cout<<"Afterexchangex&y:”<<endl;cout<<“x=“<<x<<“,y=“<<y<<endl;}圖9.2驗證函數swap()時的內存分配示意圖圖9.3函數swap()中的運算結束時的內存分配示意圖例9.1交換兩個變量的值(修改后)voidswap(int*xp,int*yp){inttmp;tmp=*xp;*xp=*yp;*yp=tmp;}voidmain(){intx=2,y=3;cout<<“x=“<<x<<“,y=“<<y<<endl; swap(&x,&y); cout<<"Afterexchangex&y:”<<endl;cout<<“x=“<<x<<“,y=“<<y<<endl;}圖9.4函數swap()中的運算結束時的內存分配示意圖指針變量的其他運算指針賦值:將一個指針賦值給另一個指針,結果是兩個指針指向一個相同的地址單元。例如,jp=&a;ip=jp;ip和jp都指向a。指針的關系運算:表示所指變量在內存中的位置關系例如,ip==jp指針的算術運算:只進行加減,完成指針移動,實現對不同數據單元的訪問操作。對不同的類型,移動的單位長度不同。指針+/-整數表達式7.3、指針與數組在C語言中,指針與數組的關系十分密切,它們都能處理內存中連續存放的一系列數據,數組與指針在訪問內存時采用同一的地址計算方法。有些場合下指針和數組的表現形式具有相同的意義。若程序中同時聲明一個short型指針;short*pa;并且通過指針賦值運算;Pa=a;或pa=&a[0];則pa指向數組a的首地址。這時:a[i]=*(a+i)=*(ptr+i)例題分析設char*ptr,*qtr;charstring[6];令ptr=string;string[1]==*(ptr+1)qtr=ptr+strlen(string);Big\0100010030x001210000x001210010x001210020x001210030x001210040x00121005ptrqtr一維數組占連續的存儲單元;稱第一個元素的地址為數組的地址;用數組名表示首地址。例9.2字符串復制算法分析①令指針指向字符串1首地址②將當前地址內容送字符串2③串1地址+1④重復②、③直到整個字符串復制完畢為止;⑤用循環語句實現,結束條件是當前值不為0。指針、數組名作為函數參數數組名也是指針常量,當然可以作為函數的參數。在函數調用時傳遞實參數組的首地址,所以在被調函數中對形參數組的處理實際就是對調用函數的實參數組的處理。在被調函數中作為形式參數的一組數組不需要說明長度,即使說明了大小也不起作用,因為C只傳遞數組首地址,而對數組邊界不加檢查。這帶來的好處是,函數對長度不等的同類數組都通用。如要指定長度可以設定另一個參數來傳遞數組元素的個數。例9.2子函數//Example9.2:復制字符串mystrcpy(char*destin,char*source){while(*source!=0){*destin=*source;source++;destin++;}*destin=0;}//用于調試函數mystrcpy()的主函數
#include<stdio.h>voidmain(){ charstring1[100]="Iamsimple."; charstring2[100]; mystrcpy(string2,string1); cout<<string2<<endl;}例9.3數組清零算法分析(用指針實現)①令指針指向數組首地址②向當前地址賦0值③指針++④重復②、③直到整個數組處理完畢為止;⑤用循環語句實現,結束條件是循環N次,N是數組的元素個數。voidclear_array(float*ptr,intlen){float*qtr=ptr+len;while(ptr<qtr){*ptr=0.0;ptr++;}}9.4動態存儲分配運算符new用來申請所需的內存
<指針>=new<類型>(<初值>);
也可為數組申請內存:
<指針>=new<類型>[<元素數>];運算符delete用于釋放先前申請到的存儲塊
delete<指針>;
若要釋放數組的空間,必須放一個空的方括號[]在操作符delete和指向該類對象數組的指針之間。int*p=newint[size];……delete[]p;[例7-4]利用動態數組求斐波那挈數列的前n項#include<iostream.h>intmain(){ intn; cout<<"Pleaseinputn=?"; cin>>n; int*p=newint[n+1];//如果沒有申請到內存或數據輸入有誤,則返回
if(p==0||n<=0) { cout<<"Error!"<<endl; return-1; } p[0]=0; p[1]=1; cout<<p[0]<<endl; cout<<p[1]<<endl; for(inti=2;i<=n;i++) { p[i]=p[i-2]+p[i-1]; cout<<p[i]<<endl; } delete[]p; //釋放數組空間 return0;}自學內容指針數組指向指針的指針結構體與指針指針的初始化指針數組指針數組:數組元素是指針的數組聲明一維指針數組的語法形式為: 數據類型*數組名[常量表達式];其中 常量表達式指出數組元素的個數, 數據類型名確定每個元素指針的類型, 數組名是指針數組的名稱,同時也是這個數組的首地址。例如,char*ptr[10]; //一維指針數組,其中包括10個數組元素,均為指向字符類型的指針:int*index[10][2];//當然也可以聲明二維以至多維指針數組指向指針的指針存放指針地址的變量也是指針,是“指向指針的指針”。指向指針的指針的說明方法為:<數據類型>**<指針變量名>;結構體與指針圖7.8指向結構體的指42/52structStudentType{charid[10]; //學號
doublescore[5]; //五門課程成績
doubleGPA; //平均分};可以有StudentTypexjtuStudent;StudentType*ptr=&xjtuStudent;指針的初始化指針變量的初始化數據類型標識符*指針變量名=初始地址值;例如: inti; int*ptr=&i;指針數組的初始化例如:char*func_namelist[]={"strcat","strchr","strcmp","strcpy","strlwr","strstr","strupr“};程序設計舉例[例7-6]編寫一個字符串比較函數,僅比較兩個字符串的前面若干個字符,且在比較時不區分大小寫字母。[例7-7]編寫一個用于對整型序列進行排序的函數,排序方法使用簡單選擇排序法。例7-6不區分大小寫字母的部分字符串比較intmystrnicmp(char*str1,char*str2,intn){while(toupper(*str1)==toupper(*str2)&&*str1!=0&&*str2!=0&&n>0){str1++;str2++;n--;}return*str1-*str2;}用于調試函數strnicmp()的主函數#include<iostream.h>#include<stdlib.h>#include<ctype.h>voidmain(){ chars1[]="JoneSmith"; chars2[]="JONESMITH"; if(strnicmp(s1,s2,10)==0) cout<<"Twostringaresame.\n"<<endl; else cout<<"Twostringaredifferent.\n";}例7-7簡單選擇排序#include<iostream.h>voidselectsort(int*list,intcount){ for(inti=0;i<count-1;i++) { intk=i; for(intj=i+1;j<count;j++) if(*(list+j)<*(list+k))k=j; if(k!=i) {inttmp=*(list+i); *(list+i)=*(list+k); *(list+k)=tmp; } }}intmain(){ intlist[6]={2,7,2,2,3,1}; selectsort(list,6); cout<<"Theresultis:"<<endl; for(inti=0;i<6;i++) cout<<list[i]<<""; cout<<endl; return0;}小結地址是存放信息數據的內存單元的編號。程序中定義的任何變量、數組或函
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024~2025學年上海七年級數冊終質量監測試題
- 績效評估與公共設施可持續發展戰略匹配度分析考核試卷
- 糖業生產過程自動化程度提升研究考核試卷
- 電力調度考核試卷
- 部編人教五年級語文下冊全冊教學課件統編版
- 數字時代創業企業危機管理與公關策略培訓考核試卷
- 部編人教版八年級語文上冊全冊教學反思
- 2025年中國PVC-U排水管件螺母數據監測研究報告
- 2025年中國PE管全自動熱熔焊機數據監測報告
- 2025年中國LED夾帽燈數據監測研究報告
- 2025年內蒙古自治區中考數學真題試卷(含答案)
- Unit 2 Home Sweet Home 第6課時(Project Reading Plus) 2025-2026學年人教版英語八年級下冊
- xx公司獎金管理制度
- 2025至2030中國彈簧鋼行業產業運行態勢及投資規劃深度研究報告
- 學習解讀《水利水電建設工程驗收規程》SLT223-2025課件
- 部編版六年級語文上冊古詩、文言文日積月累(必背)
- 職業技能鑒定題庫-《電氣試驗》
- 萬瑋:《班主任兵法》
- 施工現場防火的安全管理制度
- FM筋膜手法(課堂PPT)
- 小升初數學重點知識點梳理
評論
0/150
提交評論