一迁筛、關(guān)于指針的舉例說(shuō)明
int updates = 6;
int *p_updates;
p_updates = &updates;
cout << p_updates << endl << *p_updates << endl;
1.p_updates為int類(lèi)型指針(或者說(shuō)是指向int的指針)辉词,即常量updates的值對(duì)應(yīng)的內(nèi)存地址;
2.' *****p_updates '為指針p_updates下面存儲(chǔ)的值,再次可以說(shuō)' ****p_updates '和常量updates等效*
第二、指針的聲明和初始化
int eggs = 10;
int *p_eggs = &eggs;
cout << "The value of eggs is : " << eggs << ",and address is : " << &eggs << endl;
cout << "The value of *p_eggs is : " << *p_eggs << ",and address is : " << p_eggs << endl;
The value of eggs is : 10,and address is : 0x7fff5fbff68c
The value of *p_eggs is : 10,and address is : 0x7fff5fbff68c
Program ended with exit code: 0
int eggs = 10;
int *p_eggs = &eggs;
上面兩句代碼意思是昔搂,將 p_eggs (而不是*p_eggs)的值初始化eggs的地址;
也就是說(shuō)输拇,在指針聲明和初始化的時(shí)候摘符,被初始化的是指針,而不是指針?biāo)赶虻闹怠?/p>
第三策吠、聲明和初始化指針需要注意的一條規(guī)則
在對(duì)指針應(yīng)用解除引用運(yùn)算符(*)之前逛裤,一定要將指針初始化為一個(gè)確定的、適當(dāng)?shù)牡刂贰?/p>
請(qǐng)看下面的代碼:
int *pointer;
*pointer = 2333333;
雖然pointer是一個(gè)指針猴抹,但是我們卻不知道它指向哪里带族?pointer聲明之后,沒(méi)有被初始化一個(gè)確定的地址蟀给,所以它可能有任何值蝙砌,這個(gè)值都會(huì)被認(rèn)為是存儲(chǔ)2333333 的地址阳堕,但如果pointer的值恰巧為' 3333333 ',計(jì)算機(jī)將會(huì)把某個(gè)數(shù)據(jù)存儲(chǔ)到這個(gè)地址' 3333333 '上,這樣就可能會(huì)出現(xiàn)一個(gè)指針指向兩個(gè)值所對(duì)應(yīng)的地址择克。
第四嘱丢、使用new來(lái)分配內(nèi)存
格式如下:
typeName *pointName = new typeName;
說(shuō)明:變量的值一般存儲(chǔ)在棧(stack)的內(nèi)存區(qū)域祠饺,通過(guò)new創(chuàng)建對(duì)象指針時(shí)則從堆(heap)的內(nèi)存區(qū)域來(lái)分配內(nèi)存。
第五汁政、使用delete來(lái)釋放內(nèi)存
int *me = new int;
...
...
delete me;
說(shuō)明:
1.一定要配對(duì)使用new 和delete道偷,否則容易發(fā)生內(nèi)存泄漏。
2.不能重復(fù)使用delete來(lái)釋放內(nèi)存记劈。
3.不能使用delete來(lái)釋放聲明變量所獲得的內(nèi)存勺鸦,只能使用delete釋放通過(guò)new分配的內(nèi)存
4.空指針(沒(méi)有初始化的指針對(duì)象)可以使用delete來(lái)釋放內(nèi)存。
5.delete刪除的只是指針對(duì)象所指向的內(nèi)存目木,而不是刪除指針對(duì)象本身换途。
6.不要?jiǎng)?chuàng)建兩個(gè)指向同一塊內(nèi)存的指針對(duì)象,因?yàn)檫@樣可能會(huì)造成delete重復(fù)釋放內(nèi)存刽射。
第六军拟、使用new來(lái)創(chuàng)建動(dòng)態(tài)數(shù)組
說(shuō)明:
1.如果通過(guò)聲明來(lái)創(chuàng)建數(shù)組,則在編譯的時(shí)候就會(huì)為數(shù)組對(duì)象分配內(nèi)存誓禁,無(wú)論程序最終是否會(huì)使用該數(shù)組懈息,它都會(huì)在那里占用內(nèi)存,在編譯時(shí)給數(shù)組分配內(nèi)存稱(chēng)為靜態(tài)聯(lián)編摹恰,意味著數(shù)組是在編譯時(shí)加入到程序中的辫继。
2.使用new來(lái)創(chuàng)建數(shù)組時(shí),如果在程序運(yùn)行階段需要使用該數(shù)組俗慈,就會(huì)進(jìn)行創(chuàng)建姑宽;如果不使用該數(shù)組,則不會(huì)創(chuàng)建數(shù)組闺阱。這樣成為動(dòng)態(tài)聯(lián)編炮车,意味著數(shù)組是在運(yùn)行時(shí)創(chuàng)建的。這樣創(chuàng)建的數(shù)組稱(chēng)為動(dòng)態(tài)數(shù)組馏颂。
3.使用動(dòng)態(tài)聯(lián)編時(shí)示血,必須指明數(shù)組的長(zhǎng)度;使用動(dòng)態(tài)聯(lián)編時(shí)則程序會(huì)在運(yùn)行時(shí)確定數(shù)組的長(zhǎng)度救拉。
1.動(dòng)態(tài)數(shù)組的創(chuàng)建和釋放:
1.創(chuàng)建,需要指明數(shù)組的類(lèi)型和元素個(gè)數(shù)
int *pptv = new int[10];
2.釋放难审,應(yīng)釋放整個(gè)數(shù)組,而不是指針對(duì)象所指向的元素
delete [] pptv;
動(dòng)態(tài)數(shù)組創(chuàng)建的通用格式如下:
typeName *pointerName = new typeName[ele_num];
說(shuō)明:
1.pptv是指向數(shù)組第一個(gè)元素的指針亿絮,*pptv是第一個(gè)元素的值告喊;
2.不能使用sizeof來(lái)確定動(dòng)態(tài)分配的數(shù)組所包含的字節(jié)數(shù)
2.使用動(dòng)態(tài)數(shù)組
*pptv是數(shù)組第一個(gè)元素的值麸拄,也可以通過(guò)pptv[index]來(lái)訪問(wèn)數(shù)組中任意一個(gè)元素的值;