




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度生豬養(yǎng)殖與農(nóng)業(yè)產(chǎn)業(yè)扶貧合作協(xié)議
- 二零二五年度制造業(yè)工傷責(zé)任保險(xiǎn)合同
- 2025年度男方道歉夫妻共同生活保證協(xié)議
- 2025年度飯店短期勞務(wù)合同-客房服務(wù)員職業(yè)健康與安全協(xié)議
- 二零二五年度物業(yè)公司員工勞動(dòng)合同(含社區(qū)文化活動(dòng))
- 監(jiān)理技術(shù)服務(wù)合同
- 綠色數(shù)據(jù)中心建設(shè)運(yùn)營(yíng)合同
- 環(huán)境影響評(píng)估結(jié)果展示表
- 股份制企業(yè)股權(quán)分配與管理制度文書(shū)
- 財(cái)務(wù)與成本控制管理細(xì)則
- 2024年高考英語(yǔ)易錯(cuò)題 閱讀理解:推理判斷題4大陷阱(教師版新高考專(zhuān)用)
- 醫(yī)院環(huán)境衛(wèi)生學(xué)監(jiān)測(cè)和院感控制課件
- 《力與形變》教學(xué)課件(一)
- 湖北省2024年村干部定向考試真題
- 部編版三年級(jí)語(yǔ)文下冊(cè)期中試卷及參考答案
- JT-T-1199.1-2018綠色交通設(shè)施評(píng)估技術(shù)要求第1部分:綠色公路
- 酒店能耗分析報(bào)告
- 桃花紅杏花紅混聲合唱簡(jiǎn)譜
- DL-T995-2016繼電保護(hù)和電網(wǎng)安全自動(dòng)裝置檢驗(yàn)規(guī)程
- 2024年蘇州農(nóng)業(yè)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)含答案
- 2024年江蘇經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)含答案
評(píng)論
0/150
提交評(píng)論