版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C++語言程序設計第十一組C++語言程序設計第六章指針和引用C++語言程序設計1目錄C++語言程序設計2“指針動態(tài)內存引用基本知識指針與函數(shù)指針與字符串指針與數(shù)組指針與結構體編程技能void類型指針內存泄漏與懸掛指針刨根問底C++語言程序設計3基本知識a6.1指針關于變量(復習)定義變量:例如charch1=‘Y’;數(shù)據類型:指定了數(shù)據的表示和處理方法變量的地址:存放的位置變量的值:存放的內容使用變量名可以直接訪問內存中的數(shù)據——直接訪問C++語言程序設計46.1指針指針變量:簡稱指針,存放著某種數(shù)據類型變量的地址訪問指針變量時,只能看到地址——直接訪問通過這個地址,能訪問該地址單元中的內容——間接訪問例如:指針變量pch1中存放著字符型變量ch1的地址建立了pch1和ch1的指向關系:pch1指向ch1訪問pch1,只能看到地址:直接訪問通過pch1訪問它所指向的ch1:間接訪問C++語言程序設計56.1指針指針變量的定義格式:<類型名>*變量名1,*變量名2;例如:int*pa1,*pa2;定義指針變量時的“*”有如下兩個含義聲明變量pa1、pa2是指針變量說明變量pa1和pa2的類型是(int*)型,即指向整型變量的指針指針變量的類型:是它所指定的地址單元中存放的數(shù)據的類型pa1和pa2所指定的地址單元中,只能存放整型數(shù)據C++語言程序設計66.1指針指針的初始化是指給它分配一個有效的數(shù)據地址指針初始化的方法定義時初始化定義后賦值指針必須在初始化后才可以正確使用指針如果未初始化,其中的地址是隨機值,指針指向無意義的或者沒有權利去訪問的內存區(qū)域,這樣的指針是不能安全使用的C++語言程序設計7“先初始化,后使用”是指針變量使用的一條基本原則6.1指針定義指針變量時初始化格式:<類型名>*指針變量名=&變量名;例如:charch1=’Y’;char*pch1=&ch1;“&”:取地址運算符,可以獲取變量的地址定義指針變量后,用賦值的方式初始化例如:int*pi=0;inti=100;pi=&i;建議:在定義指針變量時,如果不確定指針的指向,應初始化為0或NULL空指針:0或NULL,表示不指向任何內存單元C++語言程序設計8例:觀察指針的值和指針變量自身的地址6.1指針C++語言程序設計9//指針變量#include<iostream>usingnamespacestd;intmain(){inta=10;int*pa=&a;cout<<pa<<""<<&pa<<endl;
return0;}6.1指針間接引用運算符“*”和指針變量連用,對指針所指向的內存地址單元進行間接訪問格式:*指針變量例如:intva=100;int*pva=&va;*pva=200;
*pva就是pva所指向的變量va要用指針來訪問它所指向的變量,必須使用間接引用運算“*”C++語言程序設計10例:對變量的直接訪問和間接訪問6.1指針C++語言程序設計11//對變量的直接訪問和間接訪問#include<iostream>usingnamespacestd;voidmain(){charch1='a',*pch=0;intk1=100;pch=&ch1;
//指針pch指向變量ch1cout<<"*pch="<<*pch<<endl; //間接訪問
*pch='B';cout<<"ch1="<<ch1<<endl; //直接訪問
ch1=k1;cout<<"*pch="<<*pch<<endl; //間接訪問}運行結果:*pch=ach1=B*pch=d6.1指針指針的算術運算指針可以和一個整數(shù)n做加法或者減法運算例如:設p為指向數(shù)組中某元素的指針p+n:表示指向p后方第n個元素p-n:表示指向pa前方第n個元素指針的(++)和(--)運算運算后,指針向其后方或前方的元素指針相減運算結果為其間元素個數(shù)注意:指針的算術運算和一般的算術運算有不同的含義C++語言程序設計12例:輸出下標為偶數(shù)的數(shù)組元素的值6.1指針C++語言程序設計13//指針運算#include<iostream>usingnamespacestd;voidmain(){intk1[10]={11,24,37,44,58,66,79,86,93,108},*pk=NULL;
pk=&k1[0];
//數(shù)組第一個元素的地址賦值給指針kfor(inti=0;i<10;i=i+2 //每次循環(huán),指針加2 cout<<"k1["<<i<<"]="<<*(pk+i)<<endl;}數(shù)組第一個元素(下標為0)的地址賦值給指針k每次循環(huán),指針加26.1指針指針的關系運算相同類型的指針可以進行各種關系運算可以測試兩個指針是否相等如果相等,則表示它們指向相同的目標數(shù)據建議:使用指針進行間接訪問之前,應測試它是否已指向有效的目標數(shù)據如果進行了指針的初始化,則指針的值只可能:為0(NULL),未指向任何目標數(shù)據已指向有效的目標數(shù)據測試方法:if(p!=NULL)或if(p)C++語言程序設計146.1指針指針的賦值運算指針的賦值運算一定是地址的賦值用來對指針變量賦值的可以是:同類型變量的地址同類型的已經初始化的指針變量向系統(tǒng)申請的同類型動態(tài)數(shù)據的地址0或NULL注意:不同類型的指針是不可以互相賦值的。在指針賦值時,不存在類型自動轉換的機制。C++語言程序設計156.2動態(tài)內存動態(tài)內存是在程序運行時才可以申請、使用和釋放的內存存放動態(tài)數(shù)據的內存區(qū)域也稱為“堆內存”動態(tài)內存不能通過變量名來使用,而只能通過指針來間接訪問堆內存的使用需要存儲大量數(shù)據時,一般申請使用堆內存數(shù)組元素個數(shù)在程序運行時才能確定時,只能使用堆內存存儲C++語言程序設計166.2動態(tài)內存C語言的動態(tài)內存申請和釋放通過函數(shù)malloc()申請動態(tài)內存通過函數(shù)free()釋放動態(tài)內存函數(shù)的聲明包含在“stdlib.h”頭文件中C++語言程序設計176.2動態(tài)內存malloc函數(shù)原型為:void*malloc(unsignedsize);malloc函數(shù)申請size個字節(jié)的內存空間,并返回指向所分配內存的void*類型的指針,如果沒有申請到內存空間,則返回NULLvoid*指針具有很好的通用性,可以通過類型轉換賦值給任何類型的指針變量例如:int*pn=(int*)malloc(sizeof(int));按照int類型數(shù)據存儲空間的大小分配內存空間整型指針pn指向該內存空間通過*pn訪問該內存空間C++語言程序設計186.2動態(tài)內存free函數(shù)原型為:voidfree(void*ptr);free函數(shù)釋放先前malloc所分配的內存,所要釋放的內存由指針ptr指向前例:free(pn);pn=NULL;因為pn指向的內存已釋放,但pn的值還存在,為其賦值0后,可以避免使用它來訪問無效內存C++語言程序設計196.2動態(tài)內存C++的動態(tài)內存申請和釋放使用new、delete運算符使用運算符new申請動態(tài)內存格式:new<類型名>(初值)如果申請成功,返回指定類型內存的地址;如果申請失敗,返回NULL指針例如:int*pi=0;pi=newint(10);*pi=100;動態(tài)內存使用完畢后,要用delete運算符來釋放格式:delete<指針名>;上例:deletepi;pi=NULL;C++語言程序設計206.2動態(tài)內存使用new申請動態(tài)一維數(shù)組格式:new<類型名>[表達式]表達式用來指定數(shù)組大小在動態(tài)申請數(shù)組空間時,不可以對數(shù)組進行初始化釋放動態(tài)數(shù)組空間都用相同的表達式格式:delete[]<指針名>;C++語言程序設計216.2動態(tài)內存例:在堆內存中申請空間存放大數(shù)組C++語言程序設計22//例6-4堆內存的申請和釋放#include<iostream>#include<ctime>usingnamespacestd;voidmain(){constintN=10000000;
int*parr=newint[N];
//int*parr=(int*)malloc(N*sizeof(int));srand(time(NULL));int*pm=parr;
for(inti=0;i<10;i++){ *pm=rand()%100; pm++;}for(inti=0;i<20;i++) cout<<*(parr+i)<<endl;
delete[]parr;//free(parr);}6.3引用引用的概念是C++中新引入的概念,也是C語言中不存在的數(shù)據類型。引用是變量或者其他編程實體(如對象)的別名引用和指針的對比指針變量有自己的存儲空間,
是獨立存在的引用類型的變量不占用單獨
的存儲空間,不能獨立存在C++語言程序設計236.3引用引用的定義格式:<類型名>&引用名=變量名;例如:
intsomeInt;
int&refInt=someInt;注意:引用必須在定義的時候就完成初始化C++語言程序設計246.3引用引用有以下特點引用不能獨立存在,它只是其他變量的別名引用必須在定義的同時就初始化引用一旦定義,引用關系就不可以更改,即B若是A的引用,就不可能是其他變量的引用引用的類型就是相關的變量的類型,引用的使用和變量的使用相同C++語言程序設計256.3引用例:引用的使用C++語言程序設計26//引用的使用#include<iostream>usingnamespacestd;voidmain(){intintA=10;
int&refA=intA;cout<<“引用的值和相關變量值相同:refA="<<refA<<endl;
refA=5;cout<<"引用變化,則相關變量也變化:intA="<<intA<<endl;cout<<"引用的地址和相關變量地址相同:intA的地址="<<&intA<<endl;cout<<"引用的地址和相關變量地址相同:refA的地址="<<&refA<<endl;}運行結果:引用的值和相關變量值相同:refA=10引用變化,則相關變量也變化:intA=5引用的地址和相關變量地址相同:intA的地址=0x0012FF7C引用的地址和相關變量地址相同:refA的地址=0x0012FF7C6.3引用關于引用的使用在實際的程序中,沒有必要在一個程序作用域中定義一個變量后,又定義它的引用程序中真正使用引用的地方是在函數(shù)調用中將引用作為函數(shù)的形式參數(shù)將引用作為函數(shù)的返回類型C++語言程序設計27C++語言程序設計28編程技能a(一)指針與函數(shù)在程序設計中,指針和引用的主要應用之一是作為函數(shù)的形式參數(shù)它們形成了C++函數(shù)調用中的另一種調用方式:地址調用地址調用可以提高參數(shù)的傳遞效率從函數(shù)返回多個結果C++語言程序設計29(一)指針與函數(shù)用指針作為函數(shù)參數(shù),實現(xiàn)地址調用,必須滿足以下條件函數(shù)的形式參數(shù)是指針變量函數(shù)的實參數(shù)是內存的地址,具體來說可以是:數(shù)組名、變量的地址、用變量地址初始化的指針形參指針類型和實參地址類型必須相同C++語言程序設計30(一)指針與函數(shù)滿足以上條件后,這樣的函數(shù)調用在使用上有以下的特點:實參傳遞給形參的是內存的地址,所以形參指針指向實參變量形參指針通過間接引用,直接訪問實參變量,包括改變實參變量的值函數(shù)調用后,可以保留對實參變量的操作結果,如果有多個實參,就可以有多個實參變量在函數(shù)調用中得到修改關于地址調用“可以返回多個結果”的理解實際上并不存在從形參到實參的“返回”操作形參指針的間接引用就是對實參變量的操作實參變量的變化在函數(shù)調用過程中已經發(fā)生,而不是在函數(shù)執(zhí)行后才發(fā)生C++語言程序設計31(一)指針與函數(shù)例:編寫數(shù)據交換的函數(shù)C++語言程序設計32#include<iostream>usingnamespacestd;voidSwap(int*a,int*b);voidmain(){intx(10),y(5);cout<<"主函數(shù)變量的值:x="<<x<<"y="<<y<<endl;Swap(&x,&y);cout<<"返回后變量的值:x="<<x<<"y="<<y<<endl;}voidSwap(int*a,int*b){intt;
t=*a;*a=*b;*b=t;cout<<"函數(shù)中完成了交換:*a="<<*a<<"*b="<<*b<<endl;}運行結果:主函數(shù)變量的值:x=10y=5函數(shù)中完成了交換:*a=5*b=10返回后變量的值:x=5y=10變量的地址作為實參數(shù)指針變量作為形式參數(shù)//通過地址調用,交換調用程序的兩/個數(shù)據(一)指針與函數(shù)執(zhí)行過程分析當main()函數(shù)調用Swap()函數(shù)時,程序中用變量x和y的地址作為實參,傳遞給指針a和b當程序調用運行到Swap()函數(shù),通過內部間接引用*a和*b進行交換,實際上就是x和y進行交換C++語言程序設計33(一)指針與函數(shù)引用的主要應用就是作為函數(shù)的形式參數(shù)引用作為函數(shù)的形式參數(shù)具有以下特點引用作為形式參數(shù),參數(shù)傳遞屬于地址傳遞引用作為形式參數(shù)時,實參數(shù)是相同類型的變量引用作為形式參數(shù)時,在函數(shù)中并不產生實參數(shù)的副本,形式參數(shù)的引用和實參數(shù)的變量實際上是同一個實體函數(shù)對引用的操作,也是對實參變量的操作,函數(shù)調用可以改變實參數(shù)的值C++語言程序設計34(一)指針與函數(shù)例:編寫數(shù)據交換的函數(shù)C++語言程序設計35#include<iostream>usingnamespacestd;voidSwap(int&a,int&b);voidmain(){intx(10),y(5);cout<<"主函數(shù)變量的值:x="<<x<<"y="<<y<<endl;Swap(x,y);cout<<"返回后變量的值:x="<<x<<"y="<<y<<endl;}voidSwap(int&a,int&b){intt;
t=a;a=b;b=t;cout<<"函數(shù)中完成了交換:a="<<a<<"b="<<b<<endl;}運行結果:主函數(shù)變量的值:x=10y=5函數(shù)中完成了交換:a=5b=10返回后變量的值:x=5y=10變量作為實參數(shù)引用變量作為形式參數(shù)//用引用作為形式參數(shù),交換兩個實際參數(shù)(一)指針與函數(shù)執(zhí)行過程分析當main()函數(shù)調用Swap()函數(shù)時,程序中用變量x和y作為實參,形參引用a是就是變量x的別名,形參引用b就是變量y的別名當程序調用運行到Swap()函數(shù),通過內部進行a和b的交換,實際上就是x和y進行交換C++語言程序設計36105aybx(一)指針與函數(shù)指針作為形式參數(shù)和引用作為形式參數(shù)的對比兩者都屬于地址調用:通過指針的地址調用和通過引用的地址調用兩者在函數(shù)調用時都不建立實參的副本,而是對實參的數(shù)據直接進行操作指針作為形式參數(shù)需要在函數(shù)中定義指針變量,引用作為形式參數(shù)不需要新建任何實體,所以用引用不需要占用新的內存,執(zhí)行效率更高用引用作為形式參數(shù),編程語句上也更簡單些在C++的編程中,會更多地使用引用作為函數(shù)的形式參數(shù)C++語言程序設計37(一)指針與函數(shù)常指針和常引用不是所有以指針或引用作為形參的函數(shù)都需要修改指針所指的數(shù)據例如:在調用一個求數(shù)組最大值的函數(shù)時,就不希望數(shù)組元素的值發(fā)生變化,所以希望在函數(shù)中能夠限制對數(shù)組元素的修改使用常指針和常引用可以實現(xiàn)對傳遞參數(shù)的保護常引用是指引用的是常量,也就是不能通過引用本身改變其所引用的對象聲明格式:const<類型名><引用名>&;如果實參數(shù)需要保護,可以使用“常引用”作為形式參數(shù)C++語言程序設計38(一)指針與函數(shù)常指針是指向常量的指針,就是規(guī)定指針所指向的內容不可以通過指針的間接引用來改變聲明格式:const<類型名>*<指針名>;例如:constint*ptint;指針ptint的類型是(constint*),也就是指向一個恒定的整型數(shù)整型數(shù)本身也許是可以改變的,只是不可以通過指針ptint的間接引用來改變而ptint也可以用不同的地址來對它賦值常指針最常見的應用是出現(xiàn)在函數(shù)原型中例如:char*strcpy(char*s1,constchar*s2);//功能是把s2指向的字符串復制給s1s2指向的字符串不要被函數(shù)修改,所以定義常指針C++語言程序設計39(一)指針與函數(shù)指針常量指針本身的內容是常量聲明格式:<類型名>*const<指針名>=<初值>;例如:charch,*constptch=&ch;指針ptch是用ch地址初始化的常量,不可以改為其他地址可以通過ptch的間接引用來改變ch的值數(shù)組名就是一個指針常量C++語言程序設計40(一)指針與函數(shù)指針函數(shù)如果一個函數(shù)的返回值是指針,則這樣的函數(shù)稱為指針函數(shù)例如:int*func01(intk);函數(shù)func01()返回一個指向整型數(shù)據的指針返回指針,實際上就是返回一個內存單元的地址注意:不能返回函數(shù)中局部變量的地址這樣的地址處于內存的棧區(qū),函數(shù)結束時所占用的??臻g就釋放了,回到主調函數(shù)后不能再使用該空間了C++語言程序設計41(一)指針與函數(shù)例:利用指針函數(shù)完成一個數(shù)組的倒序排列C++語言程序設計42//在指針函數(shù)reverse中,申請動態(tài)數(shù)組,最后返回這個地址include<iostream>usingnamespacestd;int*reverse(intconst*list,constintsize); //指針函數(shù)voidprintArray(intconst*list,constintsize);voidmain(){intlist[]={1,2,3,4,5,6};
int*pList=reverse(list,6);
//獲得倒序排序后數(shù)組的地址
printArray(pList,6); //顯示倒序排序后的數(shù)組
delete[]pList;}(一)指針與函數(shù)例:利用指針函數(shù)完成一個數(shù)組的倒序排列C++語言程序設計43//在指針函數(shù)reverse中,申請動態(tài)數(shù)組,最后返回這個地址int*reverse(intconst*list,constintsize) //指針函數(shù){int*result=newint[size];
//函數(shù)中定義的動態(tài)數(shù)組
for(inti=0,j=size-1;i<size;i++,j--)result[j]=list[i];
returnresult; //返回動態(tài)數(shù)組的地址}voidprintArray(intconst*list,constintsize){for(inti=0;i<size;i++)cout<<list[i]<<"";}不能在reverse函數(shù)中定義局部數(shù)組intresult[6],使用堆空間是比較好的解決辦法運行結果:654321(一)指針與函數(shù)函數(shù)指針指針和函數(shù)有著天然的聯(lián)系——函數(shù)名本身就是地址指向函數(shù)的指針稱為函數(shù)指針聲明格式:<類型名>(*指針名)(形參列表);例如:int(*fptr)(int,int);定義了一個函數(shù)指針fptr,它可以指向帶兩個整型參數(shù)且返回值類型為整型的任意函數(shù)函數(shù)指針指向某個函數(shù)后,就可以像使用函數(shù)名一樣使用函數(shù)指針來調用函數(shù)了注意:因為函數(shù)名代表函數(shù)的內存地址,所以給函數(shù)指針賦值時,直接用函數(shù)名,不需要取地址運算符&C++語言程序設計44(一)指針與函數(shù)例:使用函數(shù)指針調用函數(shù)C++語言程序設計45//在函數(shù)指針調用函數(shù)#include<iostream>usingnamespacestd;floatareaofRectangle(floatwidth,floatheight){ returnwidth*height;}floatareaofTriangle(floatheml,floatheight){ return(heml*height)/2;}(一)指針與函數(shù)例:使用函數(shù)指針調用函數(shù)
C++語言程序設計46voidmain(){float(*fptr)(float,float);floatarea,worh,height;cout<<"請輸入矩形的寬和高:"<<endl;cin>>worh>>height;
fptr=areaofRectangle;
area=fptr(worh,height);cout<<"矩形的面積為:"<<area<<endl;
cout<<"請輸入三角形的底和高:"<<endl;cin>>worh>>height;
fptr=areaofTriangle;area=fptr(worh,height);cout<<"三角形面積為:"<<area<<endl;} 定義函數(shù)指針直接用函數(shù)名給函數(shù)指針賦值,不需要取地址運算符&使用函數(shù)指針調用函數(shù)運行結果:請輸入矩形的寬和高:20矩形的面積為:200請輸入三角形的底和高:20三角形的面積為:100(二)指針與字符串C++處理字符串有兩種方式:數(shù)組方式和指針方式數(shù)組方式:將字符串存入字符數(shù)組后,再進行處理一般可以在聲明數(shù)組的時候用字符串來初始化例如:charstring_array[]="What’saniceday!";指針方式:用字符串常量來初始化一個字符指針例如:char*string_pt="What’saniceday!";C++字符串常量是用雙引號括起的字符序列,并以字符'\0'作為結束標志字符串常量存放在內存的常量區(qū)域字符串常量的首地址看做指針,這種指針既是常指針,也是指針常量字符串常量的內容是不能改變的,而且首地址也是不能改變的C++語言程序設計47(二)指針與字符串兩種字符串處理方式比較兩種方式在一些具體的操作上有所不同的C++語言程序設計48已
定
義chars_array[]="Thiaisabook";char*s_pt="Thisisabook";直接輸出cout<<s_array;可以cout<<s_pt;可以直接輸入cin>>s_array;可以cin>>s_pt;不可以直接更改s_array="OK";不可以s_pt="OK";可以賦值s_array=s_pt;不可以s_pt=s_array;可以常量不能放在等式左邊通過cin來修改指針所指的內容是不允許的
運行時會出錯(二)指針與字符串字符串操作函數(shù)C++提供了大量的字符串處理函數(shù)使用時都需要包含頭文件string.h(cstring)調用這些函數(shù)時,要保證作為目的字符串的實際參數(shù)必須是可寫的,且有足夠的空間存放源串,否則會出現(xiàn)運行錯誤C++語言程序設計49功能函數(shù)原型返回值說明字符串長度intstrlen(constchar*string);長度值'\0'不計入字符串復制char*strcpy(char*s1,constchar*s2);復制的字符串s1要有足夠空間按字符數(shù)復制char*strncpy(char*s1,constchar*s2);復制的字符串s1要有足夠空間字符串比較intstrcmp(constchar*s1,constchar*s2);<0,=0,>0對應s1<s2,s1=s2,s1>s2字符串連接char*strcat(char*s1,constchar*s2);連接后的字符串s1要有足夠空間(二)指針與字符串例:strcpy()和strncpy()的比較C++語言程序設計50//strcpy()和strncpy()的比較#include<iostream>#include<string>usingnamespacestd;voidmain(){intn;char*array1="HappyBirthdaytoYou";chararray3[15];chararray2[25];
strcpy(array2,array1); //復制array1到array2cout<<"Thestringinarray1is:"<<array1<<"\nThestringinarray2is:"<<array2<<'\n‘;復制array1到array2,沒有問題(二)指針與字符串例:strcpy()和strncpy()的比較C++語言程序設計51/*strcpy(array3,array1); //直接復制array1到array3cout<<array3<<endl;*/
n=sizeof(array3);strncpy(array3,array1,n-1);
//復制array1的n-1個字符到array3
array3[n-1]='\0';
//添加'\0'到array3cout<<"Thestringinarray3is:"<<array3<<endl;}復制array1到array3,空間不夠,會有運行時錯誤按實際數(shù)組大小,復制array1到array3,沒有問題運行結果:Thestringinarray1is:HappyBirthdaytoYouThestringinarray2is:HappyBirthdaytoYouThestringinarray3is:HappyBirthday(三)指針與數(shù)組指針和數(shù)組數(shù)組名本身就是地址指針和數(shù)組名聯(lián)系起來,可通過指針訪問數(shù)組雖然一維數(shù)組名和二維數(shù)組名都是地址,都可以看做某種指針,但是指針的類型是不同的通過指針訪問一維數(shù)組和二維數(shù)組的方法是不同的C++語言程序設計52(三)指針與數(shù)組一維數(shù)組名可以看做指針,它具有以下特點:指針的類型是指向數(shù)組元素的指針數(shù)組名也是數(shù)組第一個元素的地址對于數(shù)組A來說,數(shù)組名A和&A[0]具有相同的類型和相同的值通過數(shù)組名的間接引用運算,如*A,就可以訪問數(shù)組的第一個元素A[0]數(shù)組名所包含的地址值是不可改變的,是一種常量指針C++語言程序設計53(三)指針與數(shù)組通過指針訪問一維數(shù)組首先聲明一個和數(shù)組類型相同的指針,并且用數(shù)組名來對指針初始化例如:intA[10],*pa=A;通過數(shù)組名或者所定義的指針變量,用多種方式訪問數(shù)組元素數(shù)組名和下標,如:A[0]、A[4]指針和下標,如:pa[0]、pa[4]。指針加偏移量的間接引用,如:*(pa+0)、*(pa+4)。數(shù)組名加偏移量的間接引用,如:*(A+0)、*(A+4)。指針自加后的間接引用,如:*pa++注意:不允許數(shù)組名自加后的間接引用來訪問數(shù)組元素,如*A++C++語言程序設計54(三)指針與數(shù)組例:求整型數(shù)組的平均值C++語言程序設計55//通過指針求整型數(shù)組的平均值#include<iostream>usingnamespacestd;voidmain(){intintArray[10]={8,11,23,34,45,56,65,78,86,97},*ptint;inti,num,sum;floataverage;
ptint=intArray;
//指針初始化
sum=0;num=sizeof(intArray)/sizeof(*intArray);//求數(shù)組元素的數(shù)目指針初始化求數(shù)組元素數(shù)目(三)指針與數(shù)組例:求整型數(shù)組的平均值C++語言程序設計56for(i=0;i<num;i++)sum=sum+*ptint++;average=(float)sum/num;ptint=intArray; //指針再次初始化
cout<<"數(shù)組元素是:\n";for(i=0;i<num;i++)cout<<*ptint++<<"";cout<<"\n平均值是:"<<average<<endl;}需要對指針重新初始化注意:在使用“指針自加間接引用”的方法訪問一維數(shù)組時,指針本身的地址值是變化的運行結果:數(shù)組元素是:8112334455665788697平均值是:50.3(三)指針與數(shù)組指針數(shù)組若數(shù)組元素是某種類型的指針,稱這樣的數(shù)組為指針數(shù)組聲明格式:<類型>*<數(shù)組名>[常量表達式];例如:char*member_name[10];字符指針數(shù)組:例如:char*member_name[]={"Merry","John","Hill"};數(shù)組元素指向一些不同長度的字符串如果用一個指針指向這樣的數(shù)組,則能夠通過指針來訪問其中的字符串C++語言程序設計57(三)指針與數(shù)組例:指針數(shù)組及其訪問程序C++語言程序設計58//指針數(shù)組及其訪問程序#include<iostream>usingnamespacestd;voidmain(){
char*member_name[]={"Merry","John","Hill"};cout<<"Thenamelistshowas:\n";for(inti=0;i<3;++i) cout<<member_name[i]<<'\n';}運行結果:Thenamelistshow
as:MerryJohnHill(三)指針與數(shù)組指針數(shù)組作main函數(shù)的形參為了在運行C++程序時,可以由用戶提供執(zhí)行程序所需要的參數(shù),可以在程序中使用C++命令行參數(shù)命令行參數(shù)是main函數(shù)的參數(shù)帶有命令行參數(shù)的main函數(shù)的原型是:
<類型>main(intargc,char*argv[]);argc:整數(shù),存放命令行參數(shù)的數(shù)目,由程序自動統(tǒng)計,包括所執(zhí)行的程序名argv[]:指針數(shù)組,存放所輸入的命令行參數(shù)
指針數(shù)組中存放各個字符串的地址
argv[0]是所執(zhí)行的程序名
argv[argc-1]是最后一個輸入的參數(shù)字符串
argv[argc]中自動的存入NULL,表示輸入結束C++語言程序設計59(三)指針與數(shù)組例:顯示命令行參數(shù)C++語言程序設計60//顯示命令行參數(shù)#include<iostream>usingnamespacestd;voidmain(intargc,char*argv[]){cout<<"共輸入了"<<argc<<"個參數(shù),分別是:\n";for(inti=0;i<argc;++i)cout<<argv[i]<<'';}(三)指針與數(shù)組二維數(shù)組名可以看做指針,它具有以下特點:二維數(shù)組可以看成是一維數(shù)組的一維數(shù)組對二維數(shù)組B[3][4],數(shù)組名B的地址,是其中第一個一維數(shù)組B[0]的地址,B+1就是下一個一維數(shù)組B[1]的地址數(shù)組名B是指向一維數(shù)組的指針,所指向的一維數(shù)組的大小是4數(shù)組名C是指向一維數(shù)組的指針,所指向的一維數(shù)組的大小是2C++語言程序設計61(三)指針與數(shù)組通過指針訪問二維數(shù)組首先聲明一個指向一維數(shù)組的指針,并且用數(shù)組名來對指針初始化格式:<類型名>(*指針變量名)[一維數(shù)組大小];前例:char(*ptchb)[4],(*ptchc)[2];
ptchb=B;ptchc=C;ptchb指向一維數(shù)組B[0],ptchb+1就是指向一維數(shù)組B[1]*ptchb仍然是地址,是一維數(shù)組B[0]第一個元素B[0][0]的地址*ptchb+1是B[0][1]的地址用指向一維數(shù)組指針訪問第i行j列的數(shù)組元素:*(*(指針名+i)+j)C++語言程序設計62(三)指針與數(shù)組例:用單循環(huán)程序,求二維數(shù)組元素的平均值C++語言程序設計63//用單循環(huán)程序,求二維數(shù)組元素的平均值#include<iostream>usingnamespacestd;voidmain(){intdArray[3][4]={32,42,12,25,56,76,46,53,76,89,96,82};int(*pt)[4]=NULL;intsum,j;floataverage;sum=0;(三)指針與數(shù)組例:用單循環(huán)程序,求二維數(shù)組元素的平均值C++語言程序設計64//用單循環(huán)程序,求二維數(shù)組元素的平均值
pt=dArray;
//指向一維數(shù)組指針的初始化
j=sizeofdArray/sizeof**dArray; //**dArray就是元素dArray[0][0]for(inti=0;i<j;i++) sum=sum+*(*pt+i);average=(float)sum/j;cout<<"數(shù)據的平均值等于:"<<average<<endl;}運行結果:數(shù)據的平均值等于:57.0833分析:程序把二維數(shù)組dArray看成是一維數(shù)組一維數(shù)組的首地址是*pt(*dArray)數(shù)組元素的地址是*pt+i(0≤i<j)(四)指針與結構體定義指向結構體類型的指針變量例如:structstudent{longnum;charname[20];floatscore;};
student*ps=NULL;結構指針初始化將結構變量的地址賦給結構指針
例如: studentstu={20041118,"LiLi",81};
student*ps=&stu;用new運算符申請的動態(tài)內存空間的地址對指針賦值
例如:student*ps=newstudent; C++語言程序設計65(四)指針與結構體用結構指針訪問結構成員用點操作符“.”
例如:cout<<(*ps).score<<endl;用箭頭操作符“->”代替原來的點操作符
例如:cout<<ps->score<<endl; C++語言程序設計66(四)指針與結構體例:結構指針的定義和使用C++語言程序設計67//結構指針的定義和使用#include<iostream>#include<cstring>usingnamespacestd;structEmployee{charname[20];unsignedlongid;floatsalary;};voidmain(){
Employee*prPtr=newEmployee;
strcpy(prPtr->name,"zhangsan");
prPtr->id=98001;
prPtr->salary=3350.0;cout<<prPtr->name<<""<<prPtr->id<<""<<prPtr->salary<<endl;
deleteprPtr;}運行結果:zhangsan980013350(四)指針與結構體例:通過使用結構體指針數(shù)組完成結構體數(shù)組的排序在第4章結構體排序的例子中冒泡排序排序時,直接交換結構體變量,需要較大的工作量在本例中定義一個相應的結構體指針數(shù)組,每個元素是結構體變量的地址冒泡排序排序時,用交換指針來代替交換結構體變量,可以提高程序運行效率例如:pA[0]=&allone[0],pA[1]=&allone[1]
當需要交換數(shù)組元素allone[0]和allone[1]時,只將指針數(shù)組的pA[0]和pA[1]交換最后,按照結構體指針數(shù)組元素的順序,訪問和輸出排序后的結構體C++語言程序設計68(四)指針與結構體例:通過使用結構體指針數(shù)組完成結構體數(shù)組的排序C++語言程序設計69#include<iostream>#include<iomanip>usingnamespacestd;structEmployee{charname[20];unsignedlongid;floatsalary;}; //定義結構體類型Employeeallone[6]={{"zhang",12345,3390.0}, {"wang",13916,4490.0},{"zhou",27519,3110.0},{"meng",42876,6230.0},{"yang",23987,4000.0},{"chen",12335,5110.0}};
//定義結構體數(shù)組//通過使用結構體指針數(shù)組完成結構體數(shù)組的排序(四)指針與結構體例:通過使用結構體指針數(shù)組完成結構體數(shù)組的排序C++語言程序設計70voidmain(){Employee*pA[6]={&allone[0],&allone[1],&allone[2], //指針數(shù)組
&allone[3],&allone[4],&allone[5]};
Employee*temp;for(inti=1;i<6;i++){ //排序
for(intj=0;j<=5-i;j++){ //一輪比較
if(pA[j]->salary>pA[j+1]->salary){ //比較工資成員
temp=pA[j]; //指針變量的交換
pA[j]=pA[j+1]; pA[j+1]=temp;}}}(四)指針與結構體例:通過使用結構體指針數(shù)組完成結構體數(shù)組的排序C++語言程序設計71for(intk=0;k<6;k++) //輸出
cout<<setiosflags(ios::left) <<setw(6)<<pA[k]->name <<setw(10)<<pA[k]->id <<setw(5)<<pA[k]->salary<<endl;}(四)指針與結構體鏈表是通過指針鏈接在一起的一組數(shù)據項,是一種非常有用的動態(tài)數(shù)據結構數(shù)據項:鏈表結點用結構體類型表示結點數(shù)據:存儲當前數(shù)據結點鏈接指針:指向下一結點,表尾結點的鏈接指針值為0(NULL)每個結點是在需要時建立的,是動態(tài)分配內存的鏈表的結點在邏輯上是連續(xù)的,但在內存中不是連續(xù)存放的單向鏈表:鏈表以指向第一個結點的指針開始,每個結點包含下一個順序結點的指針,鏈表在結點的指針為0(NULL)時終止C++語言程序設計72(四)指針與結構體例:單向鏈表的建立C++語言程序設計73structstudent//聲明新的數(shù)據類型{longnum; //學號
charname[20];//姓名
floatscore;//成績
student*next;//指向下一個學生的指針};//單向鏈表的建立#include<iostream>#include<iomanip>usingnamespacestd;voidmain(){stud
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 六盤水職業(yè)技術學院《典型零件的工藝設計》2023-2024學年第一學期期末試卷
- 金肯職業(yè)技術學院《微機原理含實驗》2023-2024學年第一學期期末試卷
- 新蘇教版一年級下冊數(shù)學第1單元第3課時《8、7加幾》作業(yè)
- 懷化學院《影視創(chuàng)作前沿技術》2023-2024學年第一學期期末試卷
- 湖北理工學院《人力資源管理咨詢與診斷》2023-2024學年第一學期期末試卷
- 資陽口腔職業(yè)學院《測試與傳感器技術》2023-2024學年第一學期期末試卷
- 小學黨員聯(lián)系群眾、服務群眾制度
- 長沙學院《材料加工過程多尺度模擬》2023-2024學年第一學期期末試卷
- 寒露節(jié)氣策劃講座模板
- 職業(yè)導論-房地產經紀人《職業(yè)導論》名師預測卷3
- 藝術品捐贈協(xié)議
- 網絡安全系統(tǒng)運維方案
- 2024年標準溝渠回填工程承包協(xié)議版B版
- 2024年專用:物業(yè)安全管理協(xié)議3篇
- 【公開課】同一直線上二力的合成+課件+2024-2025學年+人教版(2024)初中物理八年級下冊+
- 《政府采購業(yè)務培訓》課件
- 《醫(yī)療器械召回管理辦法》培訓2024
- 網絡安全培訓內容課件
- 通信線路維護安全培訓
- 專業(yè)微信小程序開發(fā)協(xié)議范例版
- 高職組全國職業(yè)院校技能大賽(嬰幼兒照護賽項)備賽試題庫(含答案)
評論
0/150
提交評論