C語言的靈魂|“指針”

C語言的靈魂|“指針”

什麼是指針?從根本上看,指針是一個值為內存地址的變量。

——《C primer plus》

指針,一直都是C語言的重點。初學C的人可能只是知道,它是變量的地址,但卻不知道,學這個變量的地址有什麼用。指針的偉大之處其實並不在語言本身,而是在於它和結構體搭配產生的一種叫數據結構的東西。如鏈表隊列棧,樹圖等。所以,雖然在現在指針用到的地方不多,但還是要好好掌握這個知識。

&和*

在我們之前有學到那麼一個運算符是&取地址符,它的作用是返回變量的地址,我們現在要獲取一個變量的地址,讓它賦值給一個指針變量,可以這樣子操作。

1inta=0;

2int*p=&a;

這樣我們就把a的地址賦值給了p這個指針變量,注意指針變量是p而不是*p。上面也代表著p這個指針變量指向了a。如果你想聲明double類型的指針就可以把上面兩個都換成double。為什麼都要換掉,去區分開不同類型的指針呢?

每個指針變量的空間大小都是一樣的,因為它只是儲存地址,都是指針變量。既然用到的空間一樣,那我們指針就指針唄,要區分int,double指針幹嘛。這個問題我們留到下面指針的加法來討論。

指針的存儲

指針是按照16進制儲存在指針變量中的,用%p對一個指針變量進行printf操作,可以得到指針的16進制地址。

這樣子,就是把p所指的內容a賦值給了x。

1printf("%p",p);

指針的操作

對於* 這個運算符,用在聲明的時候表示的是聲明一個指針變量,就像上面那樣。聲明瞭一個int型的指針變量。

除了聲明之外,用*對一個變量進行操作就可以對它地址上的內容,也就是這個指針所指的變量進行操作。如賦值:

1intx=*p;

這裡我們就將p這個指針變量所指向的內容。如果p指向的是a變量,那麼給x賦值的就是a的值。

解引用後的四則運算

1(*p)=(*p)+1;

為什麼要括號呢,因為在這裡我們可以更加直觀的看出,是p指向的指針在進行加法而不是p這個指針變量在進行加法。

指針與一維數組

在上一篇的數組中,我們講到了數組名是數組的地址,而在這篇文章中,我們又提到了指針是一個儲存地址的變量,那這樣的話,數組和指針是有關聯的。

如果我們要數組第一個元素的地址,可以如下

1inta[10];

2int*p=&a[0];

如果我們要數組的地址,可以如下

1int*q=a;

我用%p打印出來出來後是下面這兩個(不同機器的地址會和這裡不一樣)

1000000000065FE20

2000000000065FE20

雖然它們的地址是一樣的,但是這兩個指針的類型是不一樣的,第一個指的是數組的第一個元素的地址,第二個指的是整個數組的地址。

指針+整數

當給指針加上整數的時候,因為指針指的是地址,所以當我們用指針加整數的時候就是原來的地址加上指針類型*要加的整數。

就拿一個小區來說,每個房子之間的距離是4米(模擬int的字節數)。如有一家的門牌號是3。你給地址加一個數字,它的地址會加上4乘上這個小區的房子距離。就會是第4個門牌號的房子的地址。

如果你在另一個小區,房子間的距離比較大了,為8米(模擬double的字節)。也是假如有一家的門牌號是3。你給地址加一個數字,那麼這個時候,給地址加上的應該是這個小區的房子距離8乘以加的數字。才可以得到準確的房子地址。

這就為什麼我們要區分不同的指針類似了。在兩個小區中,計算一開始的地址都是3,但是因為小區的房子間距不一樣,所以它們需要加的那個數字就會因為這個距離而變化,不只是看這個整數。

舉一個數組和指針的例子

1inta[10];

2printf("%d",*(a+3));

以上會打印出a[3]這個變量,因為我們在解引用前先對指針+3,讓它移動到了a[3]的位置。給他解引用後就是a[3]的值了。

指針減整數

這個指針減去整數就和上面的指針加整數差不多,就是減去指針類型*要減的整數。要注意的是當它用在數組名上時,不要讓指針指在數組外面。

指針減指針

可以想一下,當兩個門牌號相減的時候會得到什麼?是兩個房子的門牌號之差,而不是兩個房子的距離。這裡要注意的是,指針減指針一般是用在數組中,例如

1inta[10]

2intx=&a[3]-&a[0];

這就是指針的一些基本知識了,關於二維數組用指針表示,這裡不多寫了。如果你覺得不懂這二維數組和指針的關係的話,或者對於文章內容有什麼建議,可以關注我,我來替你解答!

“全球最大的C/C++人員聚集地就在我這裡,企鵝裙餿

直播編程學習,【14】就是我的。不管你是什麼基礎,來了就是兄弟,是兄弟就跟我一起學習C/C++!關注我,為編程點贊,每天學點小知識!工作需要、感興趣、為了入行、轉行需要學習C/C++的夥伴可以跟我學習,技術大牛、學習資料等助你早日成為一名優秀的程序員!

C語言的靈魂|“指針”



分享到:


相關文章: