第八章指針和引用ppt課件_第1頁
第八章指針和引用ppt課件_第2頁
第八章指針和引用ppt課件_第3頁
第八章指針和引用ppt課件_第4頁
第八章指針和引用ppt課件_第5頁
已閱讀5頁,還剩63頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、教學(xué)內(nèi)容:教學(xué)內(nèi)容:8.1 指針的概念及其運算指針的概念及其運算8.2 void指針和指針和const指針指針8.3 指針與數(shù)組指針與數(shù)組8.4 指針與字符串指針與字符串8.5 指針與函數(shù)指針與函數(shù)8.6 動態(tài)內(nèi)存分配動態(tài)內(nèi)存分配8.7 援用援用熟練掌握指針的概念、定義、初始化及指針運算熟練掌握指針的概念、定義、初始化及指針運算掌握指針與數(shù)組、函數(shù)、字符串等的聯(lián)系;掌握指針與數(shù)組、函數(shù)、字符串等的聯(lián)系; 掌握動態(tài)空間操作;掌握動態(tài)空間操作;掌握引用的定義格式及其使用規(guī)則掌握引用的定義格式及其使用規(guī)則教學(xué)目的:教學(xué)目的:a1012 1013b1015 1016x1201 1202 1203 12

2、04例如:語句例如:語句 printf(“%d”, a+b); 的執(zhí)行是這樣的:的執(zhí)行是這樣的: 依變量名與地址的對應(yīng)關(guān)系此對應(yīng)關(guān)系是依變量名與地址的對應(yīng)關(guān)系此對應(yīng)關(guān)系是 在編譯是確定的找到變量在編譯是確定的找到變量a的地址的地址1012和變和變 量量b的地址的地址1015 從從1012開始的兩個字節(jié)中取出開始的兩個字節(jié)中取出a的值的值(1);再;再 從從1015開始的兩個字節(jié)中取出開始的兩個字節(jié)中取出b的值的值(2) 將將a的值的值(1)與與b的值的值(2)相加后,按相加后,按“%d格式格式 輸出輸出a1012 10131012p2019l指針變量和它所指向的變量之間的關(guān)系的表示:指針變量和

3、它所指向的變量之間的關(guān)系的表示:l在程序中用在程序中用“* *”號表示號表示“指向指向“,如:,如:p p代表指針變代表指針變量,而量,而* *p p是是p p所指向的變量,見下圖所指向的變量,見下圖1012p2019a1012 1* *p p可以看到可以看到p p也代表一個變量,它和變量也代表一個變量,它和變量a a是同一是同一回事。因此語句回事。因此語句 a=1;a=1;和和 * *p=1;p=1;的作用相同的作用相同&P變量的指針:即變量的地址變量的指針:即變量的地址指針變量:存放變量地址的變量是指針變量,用指針變量:存放變量地址的變量是指針變量,用 來指向另一個變量。來指向另一個變量。

4、數(shù)據(jù)類型數(shù)據(jù)類型 * *指針變量名;指針變量名; float float * *p1, p1, * *p2; (p1p2; (p1和和p2p2是指向?qū)嵭妥兞康闹羔樖侵赶驅(qū)嵭妥兞康闹羔樧兞孔兞? )char char * *p; (pp; (p是指向字符型變量的指針變量是指向字符型變量的指針變量) )例:例:數(shù)據(jù)類型:指該指針變量所指的變量的類型。數(shù)據(jù)類型:指該指針變量所指的變量的類型。:是一個說明符,用來說明該變量是指針變量:是一個說明符,用來說明該變量是指針變量指針變量名:是用戶自定義的任意合法的標(biāo)識符。指針變量名:是用戶自定義的任意合法的標(biāo)識符。數(shù)據(jù)類型數(shù)據(jù)類型 * *指針名初始地址;指針

5、名初始地址;留意:留意: 所有指針變量在使用之前都要有確定的指向,如果所有指針變量在使用之前都要有確定的指向,如果暫時不知暫時不知 道給指針變量賦什么值,就賦道給指針變量賦什么值,就賦NULLNULL它是它是iostream.hiostream.h頭文件頭文件 中的預(yù)定義符),值為中的預(yù)定義符),值為“NULLNULL的指的指針稱為空指針。針稱為空指針。 指針變量占指針變量占4 4個存儲單元,不能將一個整型數(shù)據(jù)賦個存儲單元,不能將一個整型數(shù)據(jù)賦給指針變量給指針變量 float xfloat x;float float * *p=&xp=&x;等價:等價:float float * *p p,x

6、 x;p=&xp=&x;/p/p只能指向只能指向floatfloat型變量型變量n&:它是取地址運算符,即取運算符右側(cè)的對象的:它是取地址運算符,即取運算符右側(cè)的對象的地址地址 n* * :它是指針運算符,它有兩個含義:它是指針運算符,它有兩個含義:n在定義時在定義時* 指后面的變量是指針變量:指后面的變量是指針變量: char *cp;n除定義之外除定義之外* 指取指針?biāo)赶虻淖兞康闹?。指取指針?biāo)赶虻淖兞康闹怠?n 如:如:char *cp&a; /*cp指指a的值的值n *cp=2; /將將2的值賦給的值賦給a若若int *p,a1; 則下列語句的含義是:則下列語句的含義是:p=&a;a

7、= *p;p = &(*p);a = *(&a);/ 將將a的地址賦給的地址賦給p/將將p所指向的值賦給所指向的值賦給a/將將p所指向的值的地址賦給所指向的值的地址賦給p/將將a的值賦給的值賦給a“& &“和和“* *“運算符運算符: :優(yōu)先級相同,結(jié)合性為自右向左優(yōu)先級相同,結(jié)合性為自右向左/&/&* *p1p1代表代表a a的地址(的地址(&a&a或或p1p1). . /它的作用是使它的作用是使p2p2指向指向a a例例: : 若若int int * *p1, p1, * *p2 ,a=5,b,c;p2 ,a=5,b,c; 則下列語句的含義是:則下列語句的含義是: p1=&a;p1=&a;

8、 b=( b=(* *p1)+;p1)+; p2=& p2=&* *p1; p1; c= c=* *&a&a;/* *&a&a與與a a等價等價/相當(dāng)于相當(dāng)于a+a+ 若寫成若寫成* *p1+p1+作用就不一樣了,由于作用就不一樣了,由于+和和* *為為同一優(yōu)先級,且都為右結(jié)合性,因此它相當(dāng)于同一優(yōu)先級,且都為右結(jié)合性,因此它相當(dāng)于* *(p1+),(p1+),因此先對因此先對p1p1的原值進行的原值進行* *運算,得到運算,得到a a的的值,然后使值,然后使p1p1的值改變,這樣的值改變,這樣p1p1不再指向不再指向a a了了 例:指針變量的引用例:指針變量的引用 #include void

9、 main() int i1=600,i2=800; int *p1,*p2; p1=&i1,p2=&i2; /使使p1指向指向i1,p2指向指向i2 couti1=*p1 i2=*p2endl; *p1=300,*p2=400; /作用相當(dāng)于作用相當(dāng)于i1=300,i2=400 couti1=*p1 i2=*p2endl; *p1=*p1+1; /相當(dāng)于相當(dāng)于i1=i11; couti1=*p1 i2=*p2endl; p1=p2; /使使p1指向指向p2所指向的目標(biāo)所指向的目標(biāo)i2 couti1=*p1 i2=*p2endl; 運行該程序?qū)⒌玫饺缦陆Y(jié)果:運行該程序?qū)⒌玫饺缦陆Y(jié)果:i1=60

10、0 i2=800 i1=300 i2=400i1=301 i2=400 i1=400 i2=400 例:通過指針變量訪問整型變量例:通過指針變量訪問整型變量 運行結(jié)果為:運行結(jié)果為:100, 10100, 10#include void main( ) int a=100, b=10; int *p1, *p2; /* 定義指針變量定義指針變量p1和和p2 */ p1=&a; p2=&b; /* 使使p1指向指向a,p2指向指向b */ printf(“%d, %dn”,a,b); printf(“%d, %dn”,*p1,*p2); /*輸出輸出a、b的值的值*/ 例:輸入例:輸入a a和和

11、b b兩個整數(shù),按先大后小的順序輸出兩個整數(shù),按先大后小的順序輸出a a和和b b#include void main( )int *p1, *p2, *p, a, b; scanf(“%d,%d”,&a, &b); p1=&a; p2=&b; /* 先使先使p1指向指向a, p2指向指向b */ if(ab) p=p1;p1=p2;p2=p; /使使p1和和p2改變指向改變指向,使使p1指向指向b,p2指向指向a printf(“na=%d,b=%dnn”,a,b); printf(“max=%d,min=%dn”,*p1,*p2);運行結(jié)果:運行結(jié)果:80 60 8080 60 指針與整數(shù)

12、的加減運算:其結(jié)果仍然是一個地址,它是以指針與整數(shù)的加減運算:其結(jié)果仍然是一個地址,它是以 該指針為基點的前方或后方第該指針為基點的前方或后方第n 個數(shù)據(jù)的地址個數(shù)據(jù)的地址 指針自加,自減指針自加,自減p+,p-):自加是指向下一個數(shù)據(jù),:自加是指向下一個數(shù)據(jù), 自減是指向上一個數(shù)據(jù)自減是指向上一個數(shù)據(jù)同類型的指針相減:得出它們所指向的地址之間包含同類型的指針相減:得出它們所指向的地址之間包含的的 數(shù)據(jù)的個數(shù)數(shù)據(jù)的個數(shù) 例:例:int *p,a=1,2,3,4;p=&a0;p+=3;printf(“%d”,*p);運行的結(jié)果:運行的結(jié)果:假設(shè)假設(shè)&a0 =1022,則最后則最后p的值:的值:p

13、n sizeof(所指向變量的類型)所指向變量的類型)p=1022+32=10284例:例:#include void main() double a10; double *iptr=&a0; for(int i=0;i5;i+) ai=i*2.5; for(int j=0;j5;j+) coutaj iptr *iptrendl; iptr+; 程序運行結(jié)果如下程序運行結(jié)果如下:a0 0 x0012FF30 0 a1 0 x0012FF38 2.5 a2 0 x0012FF40 5 a3 0 x0012FF48 7.5a4 0 x0012FF50 10 例:例:char c,*p; p=&c

14、; 把變量的地址賦給相同目標(biāo)類型的指針把變量的地址賦給相同目標(biāo)類型的指針 把一個指針的值賦給相同目標(biāo)類型的另一指針把一個指針的值賦給相同目標(biāo)類型的另一指針例:例:char *p1,*p2&b; p1=p2; 把數(shù)組地址賦給相同目標(biāo)類型的另一指針把數(shù)組地址賦給相同目標(biāo)類型的另一指針例:例:char a10,*p; p= a; 假設(shè):假設(shè):int a4=1,2,34,5,*q=a;那么:那么:* *q+q+:等價于等價于* *(q+)(q+)。它先得到。它先得到* *q q,然后再使,然后再使q q自增自增1 1,( (* *q)+q)+:表示表示q q所指向的元素值加所指向的元素值加1 1* *

15、(p+)(p+)或或* *p+p+相當(dāng)于相當(dāng)于ai+ai+,先對,先對p p進行進行* *運算,再使運算,再使p p自增自增1 1* *(+p)(+p)或或* *+p+p相當(dāng)于相當(dāng)于a+ia+i,先使,先使p p自增自增1 1,再對,再對p p進行進行* *運算運算* *(p- -)(p- -)或或* *p- -p- -相當(dāng)于相當(dāng)于ai- -ai- -,p p先進行先進行* *運算,運算,p p再自減再自減1 1* *(- -p)(- -p)或或* *- -p- -p相當(dāng)于相當(dāng)于a- -ia- -i,p p先自減先自減1 1,p p再進行再進行* *運算運算 假設(shè):假設(shè):p當(dāng)前指向當(dāng)前指向a數(shù)

16、組的第數(shù)組的第i個元素,那么:個元素,那么:void空指針:空指針:是一種不確定類型的指針,它可以指向任是一種不確定類型的指針,它可以指向任何類型的變量。其語法格式為:何類型的變量。其語法格式為: void *指針變量指針變量;指針變量:不指向任何具體的數(shù)據(jù)類型,任何地址都指針變量:不指向任何具體的數(shù)據(jù)類型,任何地址都可可 以賦給指針變量以賦給指針變量例:例: int a=9; void *p1=&a; int b=*(int *)p1; int *p2=(int *)p1; 留意:留意:如果需要將如果需要將voidvoid指針的值賦給其他類型的指針,則需要指針的值賦給其他類型的指針,則需要

17、進行強制類型轉(zhuǎn)換。進行強制類型轉(zhuǎn)換。voidvoid型指針型指針p p指向了整型變量指向了整型變量i i,則應(yīng)用,則應(yīng)用* *(int(int * *)p)p才能訪才能訪 問問i i。const指針:指針:關(guān)鍵字關(guān)鍵字constconst放在不同的位置表示的意義也不相放在不同的位置表示的意義也不相同,它有以下三種形式:同,它有以下三種形式: 指向常量的指針:指針指向的內(nèi)存數(shù)據(jù)不能修改,但指針本指向常量的指針:指針指向的內(nèi)存數(shù)據(jù)不能修改,但指針本 身是變量身是變量, ,可允許這種可允許這種指針變量指向另外一指針變量指向另外一 個同類型的別的變量。個同類型的別的變量。其定義的格式為:其定義的格式為

18、: const int const int * *指針變量名;指針變量名;const int *pci; const int a=1; pci=&a;const char *pc=“Point”; 例:例:指針常量指針常量( (常指針常指針) ) :int a=1; int b=2; int *const cpi=&a; /定義指針常量定義指針常量cpi *cpi=5; /ok! 可以改變變量可以改變變量a的值的值 cpi=&b; /error! 不能改變指針不能改變指針例:例:在指針定義語句的指針名前加在指針定義語句的指針名前加const,表示指針本身是常表示指針本身是常 量,所以在定義指量

19、,所以在定義指針時必須初始化,此后不能再賦其他針時必須初始化,此后不能再賦其他 地址,但指針指向的變量是可變的地址,但指針指向的變量是可變的指向常量的指針常量指向常量的指針常量: :例:例:綜上所述,可知道綜上所述,可知道: :指向常量的指針變量可以被初始化為變量的地址值,但不指向常量的指針變量可以被初始化為變量的地址值,但不 能通過指針修改該變量的值。能通過指針修改該變量的值。不能將常量的地址賦給不指向常量的指針變量。不能將常量的地址賦給不指向常量的指針變量。 例如:例如: const int a=100; int *p; p=&a; /error! 指針變量既然可以指向變量,當(dāng)然也可以指向

20、數(shù)組或指針變量既然可以指向變量,當(dāng)然也可以指向數(shù)組或 數(shù)組元素將數(shù)組起始地址或某一元素的地數(shù)組元素將數(shù)組起始地址或某一元素的地 址放到一個變量中)。址放到一個變量中)。數(shù)組的指針:指數(shù)組的起始地址。數(shù)組的指針:指數(shù)組的起始地址。數(shù)組元素的指針:指數(shù)組元素的地址。數(shù)組元素的指針:指數(shù)組元素的地址。指向數(shù)組的指針變量:指存放數(shù)組首地址的指針變量指向數(shù)組的指針變量:指存放數(shù)組首地址的指針變量指向數(shù)組元素的指針變量:指存放數(shù)組元素的指針變量指向數(shù)組元素的指針變量:指存放數(shù)組元素的指針變量例例1: int a10; int *p=a; /等價與等價與int *p; p=a;那么:那么:該數(shù)組的第該數(shù)組的

21、第i個元素可表示為:個元素可表示為:ai 或或pi或或*(p+i)或或*(a+i)數(shù)組數(shù)組ap(p+i)p+1, a+1p+i, a+ip+9, a+9該數(shù)組的第該數(shù)組的第i個元素的地址可表示為:個元素的地址可表示為:&ai 或或&pi 或或a+i 或或p+i 或或留意:留意:a是地址常量,不允許對其賦值,是地址常量,不允許對其賦值, 諸如:諸如:a+、a=&x等都是非法的等都是非法的例:利用指針變量訪問數(shù)組元素例:利用指針變量訪問數(shù)組元素 #include void main() int size; double array =5.5,6.7,3.6,6.8,1.2; double *p_a

22、rray; p_array=array; size=sizeof(array)/sizeof(*array); for (int i=0;isize;i+) cout*(p_array+i)endl; 運行結(jié)果是:運行結(jié)果是: 5.5 6.7 3.6 6.8 1.2 cout*p_arrayendl; p_array+; 對二維數(shù)組的理解對二維數(shù)組的理解 數(shù)組名是數(shù)組的首地址。數(shù)組名是數(shù)組的首地址。 例:例: int a34; /a int a34; /a是數(shù)組的首地址。是數(shù)組的首地址。 那么,那么,a0a0、a1a1、a2 a2 是什么呢?是什么呢? 也是地址量。也是地址量。 把二維數(shù)組,理

23、解成下面的圖的形式:把二維數(shù)組,理解成下面的圖的形式:a00a00a10a10a20a20a01a01a11a11a21a21a02a02a12a12a22a22a03a03a13a13a23a23a aa00a00a10a10a20a20a01a01a11a11a21a21a02a02a12a12a22a22a03a03a13a13a23a23a0a0a1a1a2a2a a?a a 、 a0 a0 是是 a00 a00的地址,是第一行的首地址。的地址,是第一行的首地址。a00a00a10a10a20a20a01a01a11a11a21a21a02a02a12a12a22a22a03a03a1

24、3a13a23a23a0a0a1a1a2a2a aa+1a+1 、a1a1是是 a10a10的地址,是第二行的首地址。的地址,是第二行的首地址。* * a a 是是a0a0的內(nèi)容,的內(nèi)容,* * * * a a 是是 a00 a00。 a a 是二維數(shù)組,經(jīng)過兩次是二維數(shù)組,經(jīng)過兩次* * 操作,才能訪問到數(shù)組元操作,才能訪問到數(shù)組元素:素: * * a a是是 a0a0的內(nèi)容,的內(nèi)容,* * * * a a 才是才是 a00a00。 a0a0是是a00a00的地址的地址, ,* *a0a0是是a00a00的內(nèi)容。的內(nèi)容。 綜上所述,對于一般的二維數(shù)組綜上所述,對于一般的二維數(shù)組a a,有以下

25、關(guān)系:,有以下關(guān)系: * *(a+i)+j=&aij aij=(a+i)+j=&aij aij=* *( (* *(a+i)+j) (a+i)+j) 例:例: int a32=11,12,13,14,15,16,i,j; int *p=a0;那么:那么:內(nèi)存內(nèi)存1615141312113000Ha03004Ha13000Hp3000Ha3004H a1a=3000Ha+1=3004H*a=3000H*a=11a0a00a1=&a103004Ha1+1=&a113006Hp=&a003000Hp+1=&a013002H*(p+2)= 13*p+8= 19*p+= 11總之若:總之若: int a

26、22=1,2,3,4,i,j; int *p=a0;aij=(*(a+i)j*(ai+j)=*(*(a+i)+j)=*(&a00+2*i+j) &aij=ai+j=*(a+i)+j=&a00+2*i+j =a0 +2*i+j =*(p+2*i+j) = p+2*i+j那么:那么:例:通過數(shù)組元素的地址來引用二維數(shù)組元素例:通過數(shù)組元素的地址來引用二維數(shù)組元素 #include #include void main() int a3 4=1,3,5,7,9,11,13,15,17,19,21,23; for(int i=0;i3;i+) for (int j=0; j4; j+) coutset

27、w(8)*(*(a+i)+j)“ ”; /也可寫成也可寫成*(ai+j)或或(*(a+i)j coutendl; 運行結(jié)果是:運行結(jié)果是: 1 3 5 7 9 11 13 15 17 19 21 23 是一個存放二維數(shù)組行地址的指針變量,常用于處理二是一個存放二維數(shù)組行地址的指針變量,常用于處理二維數(shù)組,數(shù)組指針的定義格式為:維數(shù)組,數(shù)組指針的定義格式為:數(shù)據(jù)類型數(shù)據(jù)類型 (*變量名)變量名)常量表達式常量表達式; 數(shù)據(jù)類型:表示一維數(shù)組元素的數(shù)據(jù)類型數(shù)據(jù)類型:表示一維數(shù)組元素的數(shù)據(jù)類型* *:表示變量是指針:表示變量是指針 :表示是數(shù)組:表示是數(shù)組常量表達式:表示二維數(shù)組的每行元數(shù)的個數(shù)常量

28、表達式:表示二維數(shù)組的每行元數(shù)的個數(shù)留意:因為運算符留意:因為運算符 的優(yōu)先級高于的優(yōu)先級高于*,所以必需用圓括號(),所以必需用圓括號() 將將*與指針變量名括起來與指針變量名括起來例:例: int b22=12,36,62,14; int (*p)2=b; /表示表示p是指向數(shù)組是指向數(shù)組b的行的指針變量的行的指針變量 int *p5; /表示數(shù)組表示數(shù)組p含含5個元素,每個元素均是一個指針變量個元素,每個元素均是一個指針變量例:通過數(shù)組元素的地址來引用二維數(shù)組元素例:通過數(shù)組元素的地址來引用二維數(shù)組元素 #include void main()int a34=1,3,5,7,9,11,1

29、3,15,17,19,21,23; int (*p)4; p=a; printf(%d,*(*(p+2)+3); 運行結(jié)果是:運行結(jié)果是: 23由上可得:&ai0=ai=pi=*(p+i)=p+i&aij=&pij=*(p+i)+j=pi+jaij=pij=*(*(p+i)+j)=*(pi+j)指針數(shù)組:就是其元素為指針的數(shù)組。它是指針的集合,它的指針數(shù)組:就是其元素為指針的數(shù)組。它是指針的集合,它的 每一個元素都是指針變量,并且它們具有相同的存每一個元素都是指針變量,并且它們具有相同的存 儲類型和指向相同的數(shù)據(jù)類型。主要用于字符串的儲類型和指向相同的數(shù)據(jù)類型。主要用于字符串的 操作,其定義格

30、式為:操作,其定義格式為:數(shù)據(jù)類型數(shù)據(jù)類型 *指針數(shù)組名指針數(shù)組名 常量表達式常量表達式;數(shù)據(jù)類型:指數(shù)組中各元素指針?biāo)赶虻念愋?,?shù)據(jù)類型:指數(shù)組中各元素指針?biāo)赶虻念愋?,指針?shù)組名:也即數(shù)組的首地址,是一個標(biāo)識符;指針數(shù)組名:也即數(shù)組的首地址,是一個標(biāo)識符;常量表達式:指出這個數(shù)組中的元素個數(shù)。常量表達式:指出這個數(shù)組中的元素個數(shù)。例:例:int *p16; float *p234; static char *name3= “Tom”, ”John”, ”Mary”;例:輸入月份例:輸入月份112),輸出該月份所在季節(jié)的英文名稱。),輸出該月份所在季節(jié)的英文名稱。#include void

31、 main() char *pseason4=Spring,Summer,Autumn,Winter; int month; cinmonth; switch(month) case 12:case 1:case 2: coutpseason0endl; break; case 3:case 4:case 5: coutpseason1endl; break; case 6:case 7:case 8: coutpseason2endl; break; case 9:case 10:case 11: coutpseason3endl; break; default: coutinput dat

32、a error!; 指向指針的指針變量:指該針變量中存放的是另一個指針的地指向指針的指針變量:指該針變量中存放的是另一個指針的地 址。其也稱為二級指針。多用于訪問二址。其也稱為二級指針。多用于訪問二 維數(shù)組。維數(shù)組。 其語法格式為:其語法格式為: 數(shù)據(jù)類型數(shù)據(jù)類型 *變量名變量名 例:例:int x=32; int *p=&x; int *pp=&p;則則x、p和和pp三者之間的關(guān)系:三者之間的關(guān)系: 3000Hpp3004Hp32xp是一級指針;是一級指針;pp是二級指針。是二級指針。*ppp&x*pp*p=x。例:閱讀下列程序,寫出運行結(jié)果。例:閱讀下列程序,寫出運行結(jié)果。 #includ

33、e void main() int b34=12,36,62,56,98,63,56,99,88,32,66,22; int *p3=b0,b1,b2,*pp=p,i,j; cout輸出輸出b數(shù)組每行的首地址數(shù)組每行的首地址:n; for(i=0;i3;i+) cout*pp+ ; coutendl; pp=&p0; cout輸出輸出b數(shù)組每個元素的地址數(shù)組每個元素的地址:n; for(i=0;i3;i+) for(j=0;j4;j+) cout*(pp+i)+j ; coutendl; coutendl; pp=&p0; cout輸出輸出b數(shù)組每個元素的值數(shù)組每個元素的值:n; for(i=

34、0;i3;i+) for(j=0;j4;j+) cout*(*(pp+i)+j) ; coutendl; pi pijpi+j程序運行的結(jié)果為:程序運行的結(jié)果為: 輸出輸出b數(shù)組每行的首地址數(shù)組每行的首地址: 0 x0065FDC8 0 x0065FDD8 0 x0065FDE8 輸出輸出b數(shù)組每個元素的地址數(shù)組每個元素的地址: 0 x0065FDC8 0 x0065FDCC 0 x0065FDD0 0 x0065FDD4 0 x0065FDD8 0 x0065FDDC 0 x0065FDE0 0 x0065FDE4 0 x0065FDE8 0 x0065FDEC 0 x0065FDF0 0

35、x0065FDF4 輸出輸出b數(shù)組每個元素的值數(shù)組每個元素的值: 12 36 62 56 98 63 56 99 88 32 66 22 在在C+語言中,可以定義一個字符數(shù)組,將字符串存放在語言中,可以定義一個字符數(shù)組,將字符串存放在該數(shù)組中,通過數(shù)組下標(biāo)來訪問所需的字符;也可以定義一個該數(shù)組中,通過數(shù)組下標(biāo)來訪問所需的字符;也可以定義一個字符指針,通過指針的指向來訪問所需的字符。字符指針,通過指針的指向來訪問所需的字符。如果要通過指針訪問一個字符串,可以將這個指針指向此字符串,并利用指針的加1、減1操作實現(xiàn)對各個字符的訪問。例:利用字符指針訪問字符串。例:利用字符指針訪問字符串。 #incl

36、ude void main() char *str=hello; coutstrendl; 例:閱讀下列程序,寫出運行結(jié)果。例:閱讀下列程序,寫出運行結(jié)果。#include void main()char s=C+ program; char *ps1=computer; char *ps2,*ps3=s; ps2=mouse;/使指針變量使指針變量ps2指向字符串指向字符串mouse的首地址的首地址 couts ps1 ps2 ps3endl; ps1+;ps2+=2;ps3+=4;/移動指針移動指針 couts+4 ps1 ps2 ps3endl; cout*s *ps1 *ps2 *ps

37、3endl; ps1=s; 程序的運行結(jié)果為:程序的運行結(jié)果為: C+ program computer mouse C+ program program omputer use program C o u p 在在C C中,指針和函數(shù)可以配合使用,指針可以作函數(shù)的中,指針和函數(shù)可以配合使用,指針可以作函數(shù)的參數(shù),函數(shù)的返回值可以是指針類型,還可以有指向函數(shù)的指針參數(shù),函數(shù)的返回值可以是指針類型,還可以有指向函數(shù)的指針及其指針數(shù)組。及其指針數(shù)組。 指針作函數(shù)的參數(shù),能將一個對象的地址傳送到被調(diào)函數(shù)指針作函數(shù)的參數(shù),能將一個對象的地址傳送到被調(diào)函數(shù)中,在該被調(diào)函數(shù)中可以通過指針參數(shù)操作主調(diào)函數(shù)中

38、的對象。中,在該被調(diào)函數(shù)中可以通過指針參數(shù)操作主調(diào)函數(shù)中的對象。例:輸入兩個整數(shù),將它們按由大到小的順序輸出,連續(xù)進行上例:輸入兩個整數(shù),將它們按由大到小的順序輸出,連續(xù)進行上 述操作述操作3次,即對次,即對3對整數(shù)重復(fù)操作。對整數(shù)重復(fù)操作。#include void swap(int *,int *); void main( ) int a,b,*pa,*pb; pa=&a; pb=&b; for (int i=0;i3;i+) coutab; if(ab) swap (pa,pb); cout Output: a bendl; void swap(int *p1,int *p2) int

39、temp; temp=*p1; *p1=*p2;*p2=temp; 程序運行結(jié)果是:程序運行結(jié)果是: Input: 5 7 Output: 7 5 Input: 8 6 Output: 8 6 Input: 5 5 Output: 5 5 除除void型的函數(shù)之外,函數(shù)在調(diào)用結(jié)束后都會有返回型的函數(shù)之外,函數(shù)在調(diào)用結(jié)束后都會有返回值,指針同樣也可以作為函數(shù)的返回值。當(dāng)一個函數(shù)的返回值,指針同樣也可以作為函數(shù)的返回值。當(dāng)一個函數(shù)的返回值是指針類型時,這個函數(shù)就是指針型函數(shù)。指針型函數(shù)定值是指針類型時,這個函數(shù)就是指針型函數(shù)。指針型函數(shù)定義方式為:義方式為:類型類型* *函數(shù)名稱函數(shù)名稱( (變量

40、類型變量類型 變量名稱變量名稱) ) int *functionA( ) int var=100; int *ptr=&var; cout*ptrendl; return ptr; 例:定義一個返回例:定義一個返回intint型指針值的函數(shù)型指針值的函數(shù)functionA functionA stadic int var=100;函數(shù)指針:就是指向函數(shù)的指針。其定義格式為:函數(shù)指針:就是指向函數(shù)的指針。其定義格式為:類型類型 (*指針名)(參數(shù)表);指針名)(參數(shù)表);類型:是指函數(shù)指針?biāo)赶蚝瘮?shù)的返回值的類型類型:是指函數(shù)指針?biāo)赶蚝瘮?shù)的返回值的類型參數(shù)表:指明了該函數(shù)指針?biāo)赶蚝瘮?shù)的形參類

41、型和參數(shù)表:指明了該函數(shù)指針?biāo)赶蚝瘮?shù)的形參類型和個數(shù)個數(shù)例:例: int (*p)(int,int); 就定義了一個函數(shù)指針就定義了一個函數(shù)指針p,它指向一個返回值為整型,它指向一個返回值為整型且有兩個整型參數(shù)的函數(shù)。用函數(shù)指針前,必須先賦值,且有兩個整型參數(shù)的函數(shù)。用函數(shù)指針前,必須先賦值,使它指向一個函數(shù)的入口地址使它指向一個函數(shù)的入口地址(函數(shù)名函數(shù)名)。函數(shù)指針的初始化格式為:函數(shù)指針的初始化格式為:類型類型 (*指針名指針名) (參數(shù)表參數(shù)表)函數(shù)名;函數(shù)名;或為:或為:類型類型 (*指針名指針名) (參數(shù)表參數(shù)表); 指針名函數(shù)名;指針名函數(shù)名; 函數(shù)指針作用:函數(shù)指針作用: 調(diào)

42、用被指向的函數(shù):調(diào)用被指向的函數(shù): 其調(diào)用的格式是:其調(diào)用的格式是: (*指針變量名指針變量名) (實參表);實參表); 等價于:函數(shù)名等價于:函數(shù)名(實參表實參表) 作參數(shù):函數(shù)不能直接作參數(shù),所以當(dāng)需要用函數(shù)作參作參數(shù):函數(shù)不能直接作參數(shù),所以當(dāng)需要用函數(shù)作參 數(shù)時必須借助數(shù)時必須借助 于指向函數(shù)的指針來完成。于指向函數(shù)的指針來完成。例:通過函數(shù)指針作函數(shù)參數(shù)求三角函數(shù)的值。例:通過函數(shù)指針作函數(shù)參數(shù)求三角函數(shù)的值。#include #include double func(double (*)(double),double ); void main() double x,a,s1,s2;

43、 coutx; a=3.14159/180.0*x; s1=func(sin,a); s2=func(cos,a); coutx的正弦值:的正弦值:s1endl; coutx的余弦值:的余弦值:s2endl; double func(double (*fp)(double),double y) return (*fp)(y); 程序運行結(jié)果是:程序運行結(jié)果是: 請輸入一個角度值:請輸入一個角度值:60 x的正弦值:的正弦值:0.866025 x的余弦值:的余弦值:0.500001函數(shù)指針數(shù)組:函數(shù)指針數(shù)組: 與定義變量指針數(shù)組一樣,C+中也可以定義具有特定返回類型和特定參數(shù)類型的函數(shù)指針數(shù)組。

44、函數(shù)指針數(shù)組也可以是多維的,但常用到的是一維函數(shù)指針數(shù)組。其定義格式為:數(shù)據(jù)類型數(shù)據(jù)類型 (*函數(shù)指針名函數(shù)指針名常量表達式常量表達式)(參數(shù)表);)(參數(shù)表);例:例:int (*p5)(int,int);函數(shù)指針數(shù)組p含有5個元素,其每個元素都是一個指向函數(shù)的指針,且指向的函數(shù)都是返回值類型為整型,帶兩個整型參數(shù)的函數(shù)。動態(tài)內(nèi)存分配:是指在程序運行期間根據(jù)實際需要隨時申請內(nèi)動態(tài)內(nèi)存分配:是指在程序運行期間根據(jù)實際需要隨時申請內(nèi) 存存(new),并在不需要時釋放,并在不需要時釋放(delete)。應(yīng)用程序數(shù)據(jù)所占內(nèi)存可以分為應(yīng)用程序數(shù)據(jù)所占內(nèi)存可以分為4類:類:1全局數(shù)據(jù)區(qū):存放程序的全局數(shù)

45、據(jù)和靜態(tài)數(shù)據(jù)。2代碼區(qū):存放程序的代碼,即程序中各個函數(shù)代碼塊。3堆區(qū):也稱為自由存儲單元。存放程序中的動態(tài)數(shù)據(jù)。new與delete運算符一起使用,就可進行動態(tài)內(nèi)存的申請和釋放也稱為創(chuàng)建和刪除)。4棧區(qū):保存每個函數(shù)的局部數(shù)據(jù)函數(shù)的形參及局部變量)。申請分配內(nèi)存的方法有兩種:申請分配內(nèi)存的方法有兩種:利用malloc函數(shù)留意:該函數(shù)如分配內(nèi)存成功,則返回其起始地址,留意:該函數(shù)如分配內(nèi)存成功,則返回其起始地址, 否則返回否則返回NULLNULL。 要在程序用該函數(shù)時,應(yīng)寫出其所在的文件:要在程序用該函數(shù)時,應(yīng)寫出其所在的文件: #include #include或或 #include #in

46、clude 格式是:格式是:void void * * malloc( malloc(字節(jié)數(shù)字節(jié)數(shù)) )#include #include void main() int *ip; ip=(int *)malloc(sizeof(int); scanf(%d,ip); printf(*ip=%dn,*ip); 例:用例:用C語言提供的庫函數(shù)語言提供的庫函數(shù) malloc( ) 、free( )來動態(tài)分配釋放內(nèi)存來動態(tài)分配釋放內(nèi)存:free (ip);內(nèi)存申請的字節(jié)數(shù),內(nèi)存申請的字節(jié)數(shù),這里只申請一個這里只申請一個int返回的指針強制轉(zhuǎn)換為返回的指針強制轉(zhuǎn)換為int*類型才能與類型才能與ip相容

47、相容利用new運算符:留意:格式留意:格式1 1和格式和格式2 2都是給單個對象申請分配內(nèi)存空間;而都是給單個對象申請分配內(nèi)存空間;而 格式格式3 3和格式和格式4 4可同時給多個對象數(shù)組申請分配內(nèi)存可同時給多個對象數(shù)組申請分配內(nèi)存格式格式1 1:指針變量名:指針變量名=new =new 類型標(biāo)識符;類型標(biāo)識符;格式格式2 2:指針變量名:指針變量名=new =new 類型標(biāo)識符初始值);類型標(biāo)識符初始值);格式格式3 3:指針變量名:指針變量名=new =new 類型標(biāo)識符類型標(biāo)識符 內(nèi)存單元個數(shù)內(nèi)存單元個數(shù) ;格式格式4 4:指針:指針=new =new 數(shù)據(jù)類型數(shù)據(jù)類型 常量表達式常量表

48、達式11常量表達式常量表達式22;功能:如果分配內(nèi)存成功,則返回其起始地址,否則返回功能:如果分配內(nèi)存成功,則返回其起始地址,否則返回0 0例如:例如: int *ip,*p,*q; ip=new int; /ip指向指向1個未初始化的個未初始化的int型對象型對象 p=new int(68); /ip指向指向1個表示為個表示為68的的int型對象型對象 q=new int 5; /ip指向指向5個未初始化個未初始化int型對象首地址型對象首地址 int (*p1)3; p1=new int23; /p1將指向系統(tǒng)分配二維數(shù)組的第一行。將指向系統(tǒng)分配二維數(shù)組的第一行。mallocmalloc函

49、數(shù)和函數(shù)和newnew的區(qū)別:使用的區(qū)別:使用mallocmalloc函數(shù)分配內(nèi)存時,其返函數(shù)分配內(nèi)存時,其返 回值要經(jīng)過類型轉(zhuǎn)換后才可賦給一回值要經(jīng)過類型轉(zhuǎn)換后才可賦給一 個指針變量,而利用個指針變量,而利用newnew分配內(nèi)存分配內(nèi)存 時則不需要類型轉(zhuǎn)換。時則不需要類型轉(zhuǎn)換。釋放內(nèi)存的方式:釋放內(nèi)存的方式:利用free函數(shù)留意:使用時應(yīng)嵌入相應(yīng)的頭文件:留意:使用時應(yīng)嵌入相應(yīng)的頭文件:#include #include 或或 #include #include 格式是:格式是:free(free(起始內(nèi)存地址起始內(nèi)存地址) );利用delete運算符:闡明:格式闡明:格式1 1可釋放某一個

50、內(nèi)存單元;而格式可釋放某一個內(nèi)存單元;而格式2 2可釋放若干可釋放若干 個內(nèi)存單元的空間個內(nèi)存單元的空間格式格式1 1:delete delete 指針變量名;指針變量名;格式格式2 2:delete delete 指針變量名;指針變量名;#include #include void main() int *number,*p,*q; number=new int100; /申請分配申請分配100個個int類型所占內(nèi)存空間類型所占內(nèi)存空間 p=new int; /申請分配一個申請分配一個int類型所占內(nèi)存空間類型所占內(nèi)存空間2個字節(jié))個字節(jié)) q=(int *)malloc(10*sizeof

51、(int); /申請分配申請分配10個個int類型所占內(nèi)類型所占內(nèi)存空間存空間 if (number=NULL | p=NULL | q=NULL) cout內(nèi)存分配失敗內(nèi)存分配失敗endl; else cout內(nèi)存分配成功內(nèi)存分配成功endl ; /程序的其它部分程序的其它部分 delete number; /釋放釋放number所指向的所有內(nèi)存空間所指向的所有內(nèi)存空間 delete p; /釋放釋放p所指向的所有內(nèi)存空間所指向的所有內(nèi)存空間 free (q); /釋放釋放q所指向的所有內(nèi)存空間所指向的所有內(nèi)存空間 援用:就是某個變量或?qū)ο蟮牧硪粋€名字,所以又被稱援用:就是某個變量或?qū)ο蟮牧?/p>

52、一個名字,所以又被稱“別別 名名”。它的值和地址都與被引用的變量或?qū)ο蟮闹岛?。它的值和地址都與被引用的變量或?qū)ο蟮闹岛?地址值相同。當(dāng)聲明一個引用型變量時,需要用另一地址值相同。當(dāng)聲明一個引用型變量時,需要用另一 個變量對其初始化。其典型用法是用作函數(shù)的形參和個變量對其初始化。其典型用法是用作函數(shù)的形參和 返回值。返回值。聲明一個引用型變量的語法格式為:聲明一個引用型變量的語法格式為: 類型類型 &引用變量名引用變量名=變量名變量名; 其中:類型:是被引用變量的的類型,其中:類型:是被引用變量的的類型, &:是引用運算符。:是引用運算符。例:例:int x; int &refx=x; /定義引

53、用定義引用refx,它是變量它是變量x的引用,即別名的引用,即別名闡明:闡明:(1) refx就稱為對就稱為對x的引用,的引用,x稱為稱為refx的引用對象。的引用對象。(2)&在此不是求地址運算,而是起標(biāo)識作用。在此不是求地址運算,而是起標(biāo)識作用。(3類型標(biāo)識符是指目標(biāo)變量的類型。類型標(biāo)識符是指目標(biāo)變量的類型。(4聲明引用時,必須同時對其進行初始化。聲明引用時,必須同時對其進行初始化。(5引用聲明完畢后,相當(dāng)于目標(biāo)變量名有兩個名稱,即該引用聲明完畢后,相當(dāng)于目標(biāo)變量名有兩個名稱,即該 目標(biāo)原名稱和引用名。目標(biāo)原名稱和引用名。(6聲明一個引用,不是新定義了一個變量,它只表示該引聲明一個引用,不

54、是新定義了一個變量,它只表示該引 用名是目標(biāo)變量名的一個別名,所以系統(tǒng)并不給引用分用名是目標(biāo)變量名的一個別名,所以系統(tǒng)并不給引用分 配存儲單元。配存儲單元。例:引用的使用例:引用的使用運行的結(jié)果為:x=12 refx=12y=36 refy=36x=36 refx=36從該例可以看出:從該例可以看出:引用是被引用變量的另一個名字;引用是被引用變量的另一個名字; 引用一旦初始化后,它就與初始化它的變量綁定在一起了。引用一旦初始化后,它就與初始化它的變量綁定在一起了。即使在即使在 程序中修改了它,也不會綁定到另一個變量上。程序中修改了它,也不會綁定到另一個變量上。 引用與指針不同。指針變量可不進行

55、初始化,并且在程序中引用與指針不同。指針變量可不進行初始化,并且在程序中可以指可以指 向不同的變量。引用必須在聲明的同時用一個已經(jīng)聲明的向不同的變量。引用必須在聲明的同時用一個已經(jīng)聲明的變量初變量初 始化,并且一旦初始化后就不會再綁定到其他變量上了。始化,并且一旦初始化后就不會再綁定到其他變量上了。 引用的作用:作為另一個變量變量名很長的別名。引用的作用:作為另一個變量變量名很長的別名。 引用可以作為函數(shù)的參數(shù),建立函數(shù)參數(shù)的引用傳遞方式。引用傳遞實際上傳遞的是變量的地址,而不是變量本身。這種傳遞方式避免了傳遞大量數(shù)據(jù)帶來的額外空間開銷,從而節(jié)省大量存儲空間,減少了程序運行的時間。引用作為函數(shù)

56、的參數(shù)引用作為函數(shù)的參數(shù)引用作為函數(shù)的參數(shù)引用作為函數(shù)的參數(shù)引用作為函數(shù)的返回值引用作為函數(shù)的返回值例:例: 使用引用參數(shù),實現(xiàn)兩個數(shù)據(jù)的交換。使用引用參數(shù),實現(xiàn)兩個數(shù)據(jù)的交換。#include void swap(int &refx,int &refy) int temp; temp=refx; refx=refy; refy=temp; void main() int x=63,y=36; coutfront swap:nx=x y=yendl; swap(x,y); coutback swap:nx=x y=yendl; 運行的結(jié)果為:front swap: x=63 y=36 back

57、 swap: x=36 y=63引用作為函數(shù)參數(shù)具有兩個優(yōu)點:引用作為函數(shù)參數(shù)具有兩個優(yōu)點: 參數(shù)傳遞方式類似于指針,但可讀性卻比指針傳遞參數(shù)傳遞方式類似于指針,但可讀性卻比指針傳遞強;強; 調(diào)用函數(shù)語法簡單,與簡單傳值調(diào)用一樣,但其功調(diào)用函數(shù)語法簡單,與簡單傳值調(diào)用一樣,但其功能卻比傳能卻比傳 值方式強。值方式強。 引用作為函數(shù)的返回值引用作為函數(shù)的返回值 引用既可以作為函數(shù)的參數(shù),也可以作為函數(shù)的返回值。一般函數(shù)可以用return返回一個值,當(dāng)函數(shù)返回值時要生成一個值的副本并保存在臨時變量中。用引用返回值時,不生成值的副本。例:例: 閱讀程序,給出運行結(jié)果。閱讀程序,給出運行結(jié)果。 #in

58、clude int sum1(int a,int n); int &sum2(int a,int n); void main() int a10=1,2,3,4,5,6,7,8,9,10; int total1,total2; total1=sum1(a,10); total2=sum2(a,10); int &total3=sum2(a,10); couttotal1=total1endl; couttotal2=total2endl; couttotal3=total3endl; int sum1(int a,int n) int sum=0; for(int i=0;in;i+) sum

59、+=ai; return sum; int &sum2(int a,int n) int sum=0; for(int i=0;in;i+) sum+=ai; return sum;運行的結(jié)果為:total1=55 total2=55 total3=-858993460 闡明:闡明: 語句語句total1=sum1(a,10);在在sum1函數(shù)在返回函數(shù)在返回sum值時產(chǎn)生一個值時產(chǎn)生一個sum值的值的 副本,并保存在臨時變量中,副本,并保存在臨時變量中,total1再從臨時變量中再從臨時變量中 取得返回值;取得返回值; 語句語句total2=sum2(a,10);是引用調(diào)用,是引用調(diào)用,su

60、m2函數(shù)在返回函數(shù)在返回sum值時不產(chǎn)生值時不產(chǎn)生 sum值的副本,值的副本,total2直接從變量直接從變量sum中取得返回值;中取得返回值; 與與total2=sum2(a,10);語句類似語句類似total3=sum2(a,10);也是引用調(diào)用,但也是引用調(diào)用,但total3 本身也是一個引用,即本身也是一個引用,即total3是是sum2函數(shù)的返回值函數(shù)的返回值sum的別名。局部變的別名。局部變 量量sum的作用域為的作用域為sum2函數(shù),當(dāng)函數(shù),當(dāng)sum2結(jié)束后結(jié)束后sum也不復(fù)存在,因此,也不復(fù)存在,因此, total3的值不確定。的值不確定。 引用總結(jié):引用總結(jié):引用的目的主要用

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論