內(nèi)存區(qū)的每一個(gè)字節(jié)有一個(gè)編號(hào),這就是“地址” 。如果在程序中定義了一個(gè)變量,在對(duì)程序進(jìn)行編譯時(shí),系統(tǒng)就會(huì)給這個(gè)變量分配內(nèi)存單元。
按變量地址存取變量值的方式稱為“直接訪問(wèn)”方式。
另一種存取變量值的方式稱為“間接訪問(wèn)”的方式。即,將變量A的地址存放在另一個(gè)變量B(指針)中。然后通過(guò)A這個(gè)指針變量去訪問(wèn)B;
指針的設(shè)計(jì)有什么用途呢?
可以增加變量訪問(wèn)的途徑,使變量不僅可以通過(guò)變量名直接訪問(wèn),也可以通過(guò)指針間接訪問(wèn)。
指針可以使程序的不同部分共享數(shù)據(jù)。
可以通過(guò)指針在程序執(zhí)行過(guò)程中動(dòng)態(tài)申請(qǐng)空間。
程序運(yùn)行時(shí)每個(gè)變量都會(huì)有一塊內(nèi)存空間,變量的值就是存入在這塊空間中。程序可以通過(guò)變量名訪問(wèn)這塊空間中的數(shù)據(jù)。這種訪問(wèn)方式稱為直接訪問(wèn)。
內(nèi)存中的每字節(jié)都有一個(gè)編號(hào),每個(gè)變量對(duì)應(yīng)的內(nèi)存的起始編號(hào)稱為這個(gè)變量的地址。程序運(yùn)行時(shí),計(jì)算機(jī)記錄了每個(gè)變量和它地址的對(duì)應(yīng)關(guān)系。當(dāng)程序訪問(wèn)某個(gè)變量時(shí),計(jì)算機(jī)通過(guò)這個(gè)對(duì)應(yīng)關(guān)系找到變量的地址,訪問(wèn)該地址中的數(shù)據(jù)。
直接訪問(wèn)就如你知道A朋友(變量)家在哪里(地址),你想去他家玩,就可以直接到那個(gè)地方去。如果我不知道A朋友家信哪里,但另外有個(gè)B朋友知道,你可以從B朋友處得到A朋友家的地址,再按地址去A朋友家。這種方式稱為間接訪問(wèn)。在C++中,B朋友被稱為指針變量,并稱為B指針指向A變量;
定義一個(gè)指針變量要說(shuō)明三個(gè)問(wèn)題:
該變量的名字是什么?
該變量中存儲(chǔ)的是一個(gè)地址(即是一個(gè)指針);
該地址中存儲(chǔ)的是什么類型的數(shù)據(jù);
指針是內(nèi)存的快捷方式。
指針是內(nèi)存地址,使用指針訪問(wèn)變量,就是直接對(duì)內(nèi)存中的數(shù)據(jù)進(jìn)行操作,合理地使用指針,可以提高程序運(yùn)行的速度,增強(qiáng)操作的靈活性。
訪問(wèn)內(nèi)存中的數(shù)據(jù)有兩種方式,直接訪問(wèn)和間接訪問(wèn)。直接訪問(wèn)就是通過(guò)變量來(lái)實(shí)現(xiàn),因?yàn)樽兞渴莾?nèi)存中某一塊存儲(chǔ)區(qū)域的名稱;間接訪問(wèn)就是通過(guò)指針來(lái)實(shí)現(xiàn)。指針并不是用來(lái)存儲(chǔ)數(shù)據(jù)的,而是用來(lái)存儲(chǔ)數(shù)據(jù)在內(nèi)存中的地址,我們可以通過(guò)訪問(wèn)指針達(dá)到訪問(wèn)內(nèi)在中數(shù)據(jù)的目的。
指針類型* 名稱,如:
int* ptr; //指針的類型是int*;
通過(guò)指針來(lái)訪問(wèn)指針?biāo)赶虻膬?nèi)存區(qū)時(shí),指針?biāo)赶虻念愋蜎Q定了編譯器將把那片內(nèi)存區(qū)里的內(nèi)容當(dāng)作什么來(lái)看。
指針的類型(即指針本身的類型)和指針?biāo)赶虻念愋褪莾蓚€(gè)概念。
指針的值是指針本身存儲(chǔ)的數(shù)值,這個(gè)值將被編譯器當(dāng)作一個(gè)地址,而不是一個(gè)一般的數(shù)值。在32位程序里,所有類型的值都是一個(gè)32位整數(shù),因?yàn)?2位程序里內(nèi)存地址全都是32位的。
當(dāng)我們說(shuō)一個(gè)指針的值是xx時(shí),就相當(dāng)于說(shuō)該指針指向了以xx為首地址的一片內(nèi)存區(qū)域;我們說(shuō)一個(gè)地址指向了某塊內(nèi)存區(qū)域,就相當(dāng)于說(shuō)該指針的值是這塊內(nèi)在區(qū)域的首地址。
根據(jù)數(shù)組占據(jù)內(nèi)存中連續(xù)的存儲(chǔ)區(qū)域這樣一個(gè)性質(zhì),使用指針將使我們操作數(shù)組元素的手段更加豐富。
C語(yǔ)言中許多字符串的操作都是由指向字符數(shù)組的指針及指針的運(yùn)算來(lái)實(shí)現(xiàn)。對(duì)字符串來(lái)說(shuō)一般都是嚴(yán)格順序存取,使用指針可以打破這種存取方式,使字符串的處理更加靈活;
指針是一個(gè)其數(shù)值為地址的變量。
nurse = 22;
ptr = &nurse;
val = *ptr
以上三行等價(jià)于:
val = 22;
有關(guān)指針的數(shù)據(jù)類型 | |
定義 | 含義 |
int i; | 定義整型變量i |
int *p; | p為指向整型數(shù)據(jù)的指針變量 |
int a[n]; | 定義整型數(shù)組a,它有n個(gè)元素 |
int *p[n]; | 定義指針數(shù)組p,它由n個(gè)指向整型數(shù)據(jù)的指針元素組成 |
int (*p)[n]; | p為指向含n個(gè)元素的一維數(shù)組的指針變量 |
int f(); | f為帶回整型函數(shù)值的函數(shù) |
int *p(); | p為帶回一個(gè)指針的函數(shù),該指針指向整型數(shù)據(jù) |
int (*p)(); | p為指向函數(shù)的指針,該函數(shù)返回一個(gè)整型值 |
int **p; | p是一個(gè)指針變量,它指向一個(gè)指向整型數(shù)據(jù)的指針變量 |
指針=基本數(shù)據(jù)類型+存儲(chǔ)地址
指針是指存儲(chǔ)XX數(shù)據(jù)類型的地址,也就是訪問(wèn)到一個(gè)地址后,需要截取多長(zhǎng)的數(shù)據(jù)呢?由類型定義,即可知長(zhǎng)度;
用指針變量可以指向一個(gè)函數(shù)。
函數(shù)在編譯時(shí)被分配給一個(gè)入口地址。這個(gè)函數(shù)的入口地址就稱為函數(shù)的指針。
函數(shù)指針變量常用的用途之一是把指針作為參數(shù)傳遞到其他函數(shù)。指向函數(shù)的指針也可以作為參數(shù),以實(shí)現(xiàn)函數(shù)地址的傳遞,這樣就能夠在被調(diào)用的函數(shù)中使用實(shí)參函數(shù)。
一個(gè)數(shù)組,若其元素均為指針類型數(shù)據(jù),稱為指針數(shù)組,也就是說(shuō),指針數(shù)組中的每一個(gè)元素都相當(dāng)于一個(gè)指針變量。
指針類型數(shù)據(jù),能用來(lái)實(shí)現(xiàn)各種復(fù)雜結(jié)構(gòu)(如鏈表、樹、棧等)的運(yùn)算;
將一個(gè)變量地址賦給一個(gè)指針變量。如:
p=&a; (將變量a的地址賦給p)
p=array; (將數(shù)組array首元素地址賦給p)
p=&array[i];(將數(shù)組array第i個(gè)元素的地址賦給p)
p=max;(max為已定義的函數(shù),將max的入口地址賦給p)
p1=p2;(p1和p2都是指針變量,將p2的值賦給p1)
指針就是指向變量和對(duì)象的地址。如果對(duì)象的數(shù)據(jù)量過(guò)大,只需用指針來(lái)作形差,然后傳遞一個(gè)地址即可,從而大大提高了效率。
變量賦值可以修改內(nèi)存,在引入了指針之后,可以使用另外一種辦法來(lái)修改內(nèi)存值:星號(hào)操作??梢允褂眯翘?hào)操作符*作用于指針變量上,來(lái)直接讀取內(nèi)存的值,如:
int a = 0 ;
int* p = &a; //p指向a;
*p = 0xa0a0a0a0; //寫操作:修改p指向的內(nèi)存的值;
int b = *p //讀操作,讀取p指向的內(nèi)存的值;
星號(hào)操作是一種按地址訪問(wèn)的技術(shù),只要知道了這塊內(nèi)存的地址,就可以直接修改這塊內(nèi)存的值。
內(nèi)存操作分為兩類:讀操作,寫操作,當(dāng)*p作為左值出現(xiàn)被賦值時(shí),就是寫操作,*p作為右值時(shí),就是讀操作。
聯(lián)系客服