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