什么是指針?從根本上看,指針是一個(gè)值為內(nèi)存地址的變量。 ——《C primer plus》 指針,一直都是C語(yǔ)言的重點(diǎn)。初學(xué)C的人可能只是知道,它是變量的地址,但卻不知道,學(xué)這個(gè)變量的地址有什么用。指針的偉大之處其實(shí)并不在語(yǔ)言本身,而是在于它和結(jié)構(gòu)體搭配產(chǎn)生的一種叫數(shù)據(jù)結(jié)構(gòu)的東西。如鏈表隊(duì)列棧,樹(shù)圖等。所以,雖然在現(xiàn)在指針用到的地方不多,但還是要好好掌握這個(gè)知識(shí)。 &和* 在我們之前有學(xué)到那么一個(gè)運(yùn)算符是&取地址符,它的作用是返回變量的地址,我們現(xiàn)在要獲取一個(gè)變量的地址,讓它賦值給一個(gè)指針變量,可以這樣子操作。 1inta=0; 2int*p=&a; 這樣我們就把a(bǔ)的地址賦值給了p這個(gè)指針變量,注意指針變量是p而不是*p。上面也代表著p這個(gè)指針變量指向了a。如果你想聲明double類型的指針就可以把上面兩個(gè)都換成double。為什么都要換掉,去區(qū)分開(kāi)不同類型的指針呢?每個(gè)指針變量的空間大小都是一樣的,因?yàn)樗皇莾?chǔ)存地址,都是指針變量。既然用到的空間一樣,那我們指針就指針唄,要區(qū)分int,double指針干嘛。這個(gè)問(wèn)題我們留到下面指針的加法來(lái)討論。 指針的存儲(chǔ) 指針是按照16進(jìn)制儲(chǔ)存在指針變量中的,用%p對(duì)一個(gè)指針變量進(jìn)行printf操作,可以得到指針的16進(jìn)制地址。 這樣子,就是把p所指的內(nèi)容a賦值給了x。 1printf('%p',p); 指針的操作 對(duì)于* 這個(gè)運(yùn)算符,用在聲明的時(shí)候表示的是聲明一個(gè)指針變量,就像上面那樣。聲明了一個(gè)int型的指針變量。 除了聲明之外,用*對(duì)一個(gè)變量進(jìn)行操作就可以對(duì)它地址上的內(nèi)容,也就是這個(gè)指針?biāo)傅淖兞窟M(jìn)行操作。如賦值: 1intx=*p; 這里我們就將p這個(gè)指針變量所指向的內(nèi)容。如果p指向的是a變量,那么給x賦值的就是a的值。 解引用后的四則運(yùn)算 1(*p)=(*p)+1; 為什么要括號(hào)呢,因?yàn)樵谶@里我們可以更加直觀的看出,是p指向的指針在進(jìn)行加法而不是p這個(gè)指針變量在進(jìn)行加法。 指針與一維數(shù)組 在上一篇的數(shù)組中,我們講到了數(shù)組名是數(shù)組的地址,而在這篇文章中,我們又提到了指針是一個(gè)儲(chǔ)存地址的變量,那這樣的話,數(shù)組和指針是有關(guān)聯(lián)的。 如果我們要數(shù)組第一個(gè)元素的地址,可以如下 1inta[10]; 2int*p=&a[0]; 如果我們要數(shù)組的地址,可以如下 1int*q=a; 我用%p打印出來(lái)出來(lái)后是下面這兩個(gè)(不同機(jī)器的地址會(huì)和這里不一樣) 1000000000065FE20 2000000000065FE20 雖然它們的地址是一樣的,但是這兩個(gè)指針的類型是不一樣的,第一個(gè)指的是數(shù)組的第一個(gè)元素的地址,第二個(gè)指的是整個(gè)數(shù)組的地址。 指針+整數(shù) 當(dāng)給指針加上整數(shù)的時(shí)候,因?yàn)橹羔樦傅氖堑刂?,所以?dāng)我們用指針加整數(shù)的時(shí)候就是原來(lái)的地址加上指針類型*要加的整數(shù)。 就拿一個(gè)小區(qū)來(lái)說(shuō),每個(gè)房子之間的距離是4米(模擬int的字節(jié)數(shù))。如有一家的門牌號(hào)是3。你給地址加一個(gè)數(shù)字,它的地址會(huì)加上4乘上這個(gè)小區(qū)的房子距離。就會(huì)是第4個(gè)門牌號(hào)的房子的地址。 如果你在另一個(gè)小區(qū),房子間的距離比較大了,為8米(模擬double的字節(jié))。也是假如有一家的門牌號(hào)是3。你給地址加一個(gè)數(shù)字,那么這個(gè)時(shí)候,給地址加上的應(yīng)該是這個(gè)小區(qū)的房子距離8乘以加的數(shù)字。才可以得到準(zhǔn)確的房子地址。 這就為什么我們要區(qū)分不同的指針類似了。在兩個(gè)小區(qū)中,計(jì)算一開(kāi)始的地址都是3,但是因?yàn)樾^(qū)的房子間距不一樣,所以它們需要加的那個(gè)數(shù)字就會(huì)因?yàn)檫@個(gè)距離而變化,不只是看這個(gè)整數(shù)。 舉一個(gè)數(shù)組和指針的例子 1inta[10]; 2printf('%d',*(a+3)); 以上會(huì)打印出a[3]這個(gè)變量,因?yàn)槲覀冊(cè)诮庖们跋葘?duì)指針+3,讓它移動(dòng)到了a[3]的位置。給他解引用后就是a[3]的值了。 指針減整數(shù) 這個(gè)指針減去整數(shù)就和上面的指針加整數(shù)差不多,就是減去指針類型*要減的整數(shù)。要注意的是當(dāng)它用在數(shù)組名上時(shí),不要讓指針指在數(shù)組外面。 指針減指針 可以想一下,當(dāng)兩個(gè)門牌號(hào)相減的時(shí)候會(huì)得到什么?是兩個(gè)房子的門牌號(hào)之差,而不是兩個(gè)房子的距離。這里要注意的是,指針減指針一般是用在數(shù)組中,例如 1inta[10] 2intx=&a[3]-&a[0]; 這就是指針的一些基本知識(shí)了,關(guān)于二維數(shù)組用指針表示,這里不多寫(xiě)了。如果你覺(jué)得不懂這二維數(shù)組和指針的關(guān)系的話,或者對(duì)于文章內(nèi)容有什么建議,可以關(guān)注我,我來(lái)替你解答! “全球最大的C/C++人員聚集地就在我這里,企鵝裙餿直播編程學(xué)習(xí),【14】就是我的。不管你是什么基礎(chǔ),來(lái)了就是兄弟,是兄弟就跟我一起學(xué)習(xí)C/C++!關(guān)注我,為編程點(diǎn)贊,每天學(xué)點(diǎn)小知識(shí)!工作需要、感興趣、為了入行、轉(zhuǎn)行需要學(xué)習(xí)C/C++的伙伴可以跟我學(xué)習(xí),技術(shù)大牛、學(xué)習(xí)資料等助你早日成為一名優(yōu)秀的程序員! |
|
來(lái)自: 回家的夢(mèng)想 > 《待分類》