C程序設(shè)計(jì):第七章 指針_第1頁(yè)
C程序設(shè)計(jì):第七章 指針_第2頁(yè)
C程序設(shè)計(jì):第七章 指針_第3頁(yè)
C程序設(shè)計(jì):第七章 指針_第4頁(yè)
C程序設(shè)計(jì):第七章 指針_第5頁(yè)
已閱讀5頁(yè),還剩46頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1第七章 指針C+程序設(shè)計(jì)2本章主要內(nèi)容指針動(dòng)態(tài)存儲(chǔ)分配指針與數(shù)組指針與函數(shù)3取地址運(yùn)算地址運(yùn)算符:&例:int i,j;則&i 表示變量i在內(nèi)存中的起始地址 &j表示變量j在內(nèi)存中的起始地址i20004聲明例:static int i; static int *i_pointer=&i; 指向整型變量的指針指針變量的概念概念指針:另一個(gè)變量的地址, 用于間接訪(fǎng)問(wèn)變量指針變量: 用于存放地址的變量20003i_pointer*i_pointeri2000內(nèi)存用戶(hù)數(shù)據(jù)區(qū)變量 i變量 j變量 i_pointer362000200020023010引用例1: i=3;例2: *i_pointer=3

2、; 指 針&i5指針變量的初始化語(yǔ)法形式 存儲(chǔ)類(lèi)型 數(shù)據(jù)類(lèi)型 *指針名初始地址;例: int a,*pa=&a;注意事項(xiàng)用變量地址作為初值時(shí),該變量必須在指針初始化之前已說(shuō)明過(guò),且變量類(lèi)型應(yīng)與指針類(lèi)型一致??梢杂靡粋€(gè)已賦初值的指針去初始化另一 個(gè)指針變量。但必須是同一類(lèi)型的指針。 指 針6指針變量的算術(shù)運(yùn)算指針與整數(shù)的加減運(yùn)算指針 p 加上或減去 n ,其意義是指針當(dāng)前指向位置的前方或后方第 n 個(gè)數(shù)據(jù)的地址。這種運(yùn)算的結(jié)果值取決于指針指向的數(shù)據(jù)類(lèi)型。指針加一,減一運(yùn)算指向下一個(gè)或前一個(gè)數(shù)據(jù)。例如:y=*px+ 相當(dāng)于 y=*(px+) (*和+優(yōu)先級(jí)相同,自右向左運(yùn)算) 指 針papa-2p

3、a-1pa+1pa+2pa+3*(pa-2)*pa*(pa+1)*(pa+2)*(pa+3)*(pa-1)short *papb-1pbpb+1pb+2*(pb-1)*pb*(pb+1)*(pb+2)long *pb9關(guān)系運(yùn)算指向相同類(lèi)型數(shù)據(jù)的指針之間可以進(jìn)行各種關(guān)系運(yùn)算。一般這種關(guān)系運(yùn)算包括“相等”或“不相等”的比較。兩個(gè)指針變量相等表示它們指向同一個(gè)變量。指向不同數(shù)據(jù)類(lèi)型的指針,以及指針與一般整數(shù)變量之間的關(guān)系運(yùn)算是無(wú)意義的。指針變量的關(guān)系運(yùn)算 指 針10賦值運(yùn)算向指針變量賦的值可以是地址常量,如數(shù)組名;或變量的地址,不能是普通整數(shù)。如:int a10; int *p1, *p2, i;

4、p1=a; p2=&i; i=10; *p1 = *p2;但可以賦值為整數(shù)0,表示空指針。指針變量的賦值運(yùn)算 指 針11指針變量的類(lèi)型指針名=地址“地址”中存放的數(shù)據(jù)類(lèi)型與指針類(lèi)型必須相符。指針的類(lèi)型是它所指向變量的類(lèi)型,而不是指針本身數(shù)據(jù)值的類(lèi)型,任何一個(gè)指針本身的數(shù)據(jù)值都是unsigned long int型。允許定義指向 void 類(lèi)型的指針。該指針可以被賦予任何類(lèi)型對(duì)象的地址。例: void *general; 指 針12指向數(shù)組元素的指針定義與賦值例: int a10, *pa; pa=&a0; 或 pa=a;通過(guò)指針引用數(shù)組元素經(jīng)過(guò)上述定義及賦值后:*pa就是a0,*(pa+1)就

5、是a1,. ,*(pa+i)就是ai.ai, *(pa+i), *(a+i), pai都是等效的。不能寫(xiě) a+,因?yàn)閍是數(shù)組首地址是常量。 指 針例:設(shè)一個(gè)a數(shù)組,整型,有10個(gè)元素。用三種方法輸出各元素:使用數(shù)組下標(biāo)main() int a10; int i; for(i=0; iai; coutendl; for(i=0; i10; i+) coutai;例:設(shè)一個(gè)a數(shù)組,整型,有10個(gè)元素。用三種方法輸出各元素:使用數(shù)組名main() int a10; int i; for(i=0; iai; coutendl; for(i=0; i10; i+) cout*(a+i);例:設(shè)一個(gè)a數(shù)組

6、,整型,有10個(gè)元素。用三種方法輸出各元素:使用指針變量main() int a10; int *p,i; for(i=0; iai; coutendl; for(p=a; p(a+10); p+) cout*p;16指針數(shù)組數(shù)組的元素是指針型例:Location *pa2; 由pa0,pa1兩個(gè)指針組成 指 針17指針與常量指向常量的指針不能通過(guò)指針來(lái)改變所指對(duì)象的值,但指針本身可以改變,可以指向另外的對(duì)象。例: char key = a,c,b,a,d,0; const char *p=John; coutpendl; p=key; coutpendl; 指 針18指針與常量指向常量的指針

7、不能通過(guò)指針來(lái)改變所指對(duì)象的值,但指針本身可以改變,可以指向另外的對(duì)象。例: char key = a,c,b,a,d,0; const char *p=John; coutpendl; p=key; coutpendl; *p= b; / l-value specifies const object 指 針19指針與常量若定義指針常量,則指針本身的值不能被改變。例:char key = a,c,b,a,d,0;char *const p=John;coutpendl;p=key; / l-value specifies const objectcoutpendl;*p=b; 指 針20指針應(yīng)

8、用舉例#include int main()int *pt_int;float *pt_float;int pig = 7, dog = 27;float x = 1.2345, y = 32.14;void *general; 指 針 pt_int = &pig; *pt_int += dog;/pig=pig+dog=34 cout Pig now has the value of *pt_int n; general = pt_int; /指向int型的指針賦值給void型指針 pt_float = &x; y += 5 * (*pt_float); cout y now has the

9、 value of y n; general = pt_float; /指向float型的指針賦值給void型指針 const char *name1 = John; /指向常量的指針,所指對(duì)象之值不能改變 char *const name2 = John; /常量指針,指針本身不能被改變 return 0;運(yùn)行結(jié)果:Pig now has the value of 34y now has the value of 38.312523指向常量的指針做形參#includeconst int N=6;void print(const int *p,int n);void main() int ar

10、rayN; for(int i=0;iarrayi; print(array,N); 指 針void print(const int *p, int n) cout*p; for(int i=1;in;i+) cout.*(p+i); coutendl;/注:在此題中,將const int *p換成 int *p,結(jié)果是一樣的。25動(dòng)態(tài)申請(qǐng)內(nèi)存操作符 newnew 類(lèi)型名T(初值列表)功能:在程序執(zhí)行期間,申請(qǐng)用于存放T類(lèi)型對(duì)象的內(nèi)存空間,并依初值列表賦以初值。結(jié)果值:成功:T類(lèi)型的指針,指向新分配的內(nèi)存。失?。?(NULL) 動(dòng)態(tài)存儲(chǔ)分配26釋放內(nèi)存操作符deletedelete 指針P功能

11、:釋放指針P所指向的內(nèi)存。P必須是new操作的返回值。 動(dòng)態(tài)存儲(chǔ)分配27動(dòng)態(tài)存儲(chǔ)分配舉例#include struct date int month; int day; int year; 動(dòng)態(tài)存儲(chǔ)分配int main() int index, *point1, *point2; point1 = &index; *point1 = 77; point2 = new int; *point2 = 173; cout The values are index *point1 *point2 n; delete point2; point1 = new int; point2 = point1;

12、*point1 = 999; cout The values are index *point1 *point2 month = 10; date_point-day = 18; date_point-year = 1938; cout month / day / year n; delete date_point; /釋放結(jié)構(gòu)體 char *c_point; c_point = new char37; /動(dòng)態(tài)分配數(shù)組 delete c_point; /釋放數(shù)組 c_point = new charsizeof(date) + 133; /動(dòng)態(tài)分配數(shù)組 delete c_point; /釋放數(shù)

13、組 return 0;運(yùn)行結(jié)果:The values are 77 77 173The values are 77 999 99910/18/193832以指針作為函數(shù)參數(shù)以地址方式傳遞數(shù)據(jù),可以用來(lái)返回函數(shù)處理結(jié)果。實(shí)參是數(shù)組名時(shí)形參可以是指針。 指針與函數(shù)33指針做函數(shù)參數(shù)舉例#include#includelocation.hvoid f(Location *a, int n);int main() Location *pa2; /動(dòng)態(tài)生成對(duì)象,其地址賦給指針數(shù)組元素 pa0=new Location(1,3); pa1=new Location(2,4); f(pa,2); delet

14、e pa0; delete pa1; return 0; 指針與函數(shù)void f(Location *a, int n)/實(shí)參是指針數(shù)組,形參應(yīng)使用二級(jí)指針/也可以寫(xiě)成 void f(Location *a , int n) for(int i=0;in;i+) coutGetX()endl;運(yùn)行結(jié)果:Constructor called.Constructor called.12Destructor called.Destructor called.35例:讀入三個(gè)浮點(diǎn)數(shù),將整數(shù)部分和小數(shù)部分分別輸出#include void splitfloat(float x, int *intpart

15、, float *fracpart) /形參intpart、 fracpart是指針*intpart = int(x);/ 取x的整數(shù)部分*fracpart = x - *intpart; /取x的小數(shù)部分 指針與函數(shù)void main(void)int i, n;float x, f;cout Enter three (3) floating point numbers endl;for (i = 0; i x;splitfloat(x,&n,&f); /變量地址做實(shí)參cout Integer Part is n Fraction Part is f endl;運(yùn)行結(jié)果:Enter thre

16、e (3) floating point numbers 4.7Integer Part is 4 Fraction Part is 0.78.913Integer Part is 8 Fraction Part is 0.913-4.7518Integer Part is -4 Fraction Part is -0.751838例: 輸出數(shù)組元素的內(nèi)容和地址#include #include void Array_Ptr(long *P, int n)int i;cout In func, address of array is unsigned long(P) endl;cout Acc

17、essing array in the function using pointers endl;for (i = 0; i n; i+)cout Address for index i is unsigned long(P+i);cout Value is *(P+i) endl; 指針與函數(shù)void main(void)long list5 = 50, 60, 70, 80, 90;cout In main, address of array is unsigned long(list) endl;cout endl; Array_Ptr(list,5);運(yùn)行結(jié)果:In main, add

18、ress of array is 6684132In func, address of array is 6684132Accessing array in the function using pointers Address for index 0 is 6684132 Value is 50 Address for index 1 is 6684136 Value is 60 Address for index 2 is 6684140 Value is 70 Address for index 3 is 6684144 Value is 80 Address for index 4 i

19、s 6684148 Value is 9041指針型函數(shù)當(dāng)函數(shù)的返回值是地址時(shí),該函數(shù)就是指針形函數(shù)。定義形式 存儲(chǔ)類(lèi)型 數(shù)據(jù)類(lèi)型 *函數(shù)名() 指針與函數(shù)42定義形式 存儲(chǔ)類(lèi)型 數(shù)據(jù)類(lèi)型 (*函數(shù)指針名)(); 含義:數(shù)據(jù)指針指向數(shù)據(jù)存儲(chǔ)區(qū),而函數(shù)指針指向的是程序代碼存儲(chǔ)區(qū)。指向函數(shù)的指針 指針與函數(shù)43舉例#include void print_stuff(float data_to_ignore);void print_message(float list_this_data);void print_float(float data_to_print);void (*function_p

20、ointer)(float);int main() float pi = 3.14159; float two_pi = 2.0 * pi; 指針與函數(shù) print_stuff(pi); function_pointer = print_stuff; function_pointer(pi); function_pointer = print_message; function_pointer(two_pi); function_pointer(13.0); function_pointer = print_float; function_pointer(pi); print_float(pi

21、); return 0;void print_stuff(float data_to_ignore) printf(This is the print stuff function.n);void print_message(float list_this_data) printf(The data to be listed is %fn, list_this_data);void print_float(float data_to_print) printf(The data to be printed is %fn, data_to_print);運(yùn)行結(jié)果:This is the print stuff function. This

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論