




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(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è)變量的地址, 用于間接訪問變量指針變量: 用于存放地址的變量20003i_pointer*i_pointeri2000內(nèi)存用戶數(shù)據(jù)區(qū)變量 i變量 j變量 i_pointer362000200020023010引用例1: i=3;例2: *i_pointer=3
2、; 指 針&i5指針變量的初始化語法形式 存儲(chǔ)類型 數(shù)據(jù)類型 *指針名初始地址;例: int a,*pa=&a;注意事項(xiàng)用變量地址作為初值時(shí),該變量必須在指針初始化之前已說明過,且變量類型應(yīng)與指針類型一致。可以用一個(gè)已賦初值的指針去初始化另一 個(gè)指針變量。但必須是同一類型的指針。 指 針6指針變量的算術(shù)運(yùn)算指針與整數(shù)的加減運(yùn)算指針 p 加上或減去 n ,其意義是指針當(dāng)前指向位置的前方或后方第 n 個(gè)數(shù)據(jù)的地址。這種運(yùn)算的結(jié)果值取決于指針指向的數(shù)據(jù)類型。指針加一,減一運(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)算指向相同類型數(shù)據(jù)的指針之間可以進(jìn)行各種關(guān)系運(yùn)算。一般這種關(guān)系運(yùn)算包括“相等”或“不相等”的比較。兩個(gè)指針變量相等表示它們指向同一個(gè)變量。指向不同數(shù)據(jù)類型的指針,以及指針與一般整數(shù)變量之間的關(guān)系運(yùn)算是無意義的。指針變量的關(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指針變量的類型指針名=地址“地址”中存放的數(shù)據(jù)類型與指針類型必須相符。指針的類型是它所指向變量的類型,而不是指針本身數(shù)據(jù)值的類型,任何一個(gè)指針本身的數(shù)據(jù)值都是unsigned long int型。允許定義指向 void 類型的指針。該指針可以被賦予任何類型對(duì)象的地址。例: void *general; 指 針12指向數(shù)組元素的指針定義與賦值例: int a10, *pa; pa=&a0; 或 pa=a;通過指針引用數(shù)組元素經(jīng)過上述定義及賦值后:*pa就是a0,*(pa+1)就
5、是a1,. ,*(pa+i)就是ai.ai, *(pa+i), *(a+i), pai都是等效的。不能寫 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指針與常量指向常量的指針不能通過指針來改變所指對(duì)象的值,但指針本身可以改變,可以指向另外的對(duì)象。例: char key = a,c,b,a,d,0; const char *p=John; coutpendl; p=key; coutpendl; 指 針18指針與常量指向常量的指針
7、不能通過指針來改變所指對(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 類型名T(初值列表)功能:在程序執(zhí)行期間,申請(qǐng)用于存放T類型對(duì)象的內(nèi)存空間,并依初值列表賦以初值。結(jié)果值:成功:T類型的指針,指向新分配的內(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ù),可以用來返回函數(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í)指針/也可以寫成 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ǔ)類型 數(shù)據(jù)類型 *函數(shù)名() 指針與函數(shù)42定義形式 存儲(chǔ)類型 數(shù)據(jù)類型 (*函數(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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 七年級(jí)下冊(cè)第三單元名著導(dǎo)讀《〈駱駝祥子〉:圈點(diǎn)與批注》圖文解讀
- 2024光伏逆變器全自動(dòng)智能老化測(cè)試系統(tǒng)
- 跨境電商英語口語實(shí)戰(zhàn)跨境溝通無障礙
- 透視財(cái)務(wù)報(bào)表助力精準(zhǔn)投資
- 2025年02月山東聊城市市屬事業(yè)單位初級(jí)綜合類崗位公開招聘人員68人筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 貴州2025年01月貴州省習(xí)水縣2025年公開招考220名事業(yè)單位人員筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 跨學(xué)科教學(xué)中的課堂氛圍營(yíng)造策略
- 四川2025年02月四川省攀枝花市西區(qū)礦產(chǎn)資源保護(hù)中心公開招考2名臨聘工作人員筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 四川2024年12月四川省德陽檢察機(jī)關(guān)招錄11名聘用制書記員筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 跨部門協(xié)作在藥品批發(fā)行業(yè)客戶關(guān)系管理中的應(yīng)用
- 湖北省2024年村干部定向考試真題
- 部編版三年級(jí)語文下冊(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ù)含答案
- 2024年大理農(nóng)林職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)含答案
- C語言課程思政案例
- 《柔性棚洞防護(hù)結(jié)構(gòu)技術(shù)規(guī)程》
評(píng)論
0/150
提交評(píng)論