數據結構知識基礎之指針


  對於很多學習過c語言的同志們來說都知道指針是c語言中最最精粹的地方。就拿我現在主攻的php語言來說,php這種動態腳本語言底層也是用c來實現的,當我們實例化一個對象時,其實真正的過程也是一個在棧內存中的地址指向堆內存中真正的對象的過程,也就是說真正的對象時放在堆內存中,棧內存中放的是指向堆內存中對象的地址,PHP就是通過這種地址的指向實現了一個對象實例化的過程。上面插了一點,現在就來說說指針和地址的定義。

  地址:地址就是內存單元中的編號,是一個從0開始的非負整數,范圍和我們的內存有關,若我們的內存是4G,則地址范圍就是0-4G-1。

  指針:在c語言中,指針是一種類型,被稱為“指針類型”,描述的地址。簡單的說指針就是地址,地址就是指針,指針變量是存放內存單元地址的變量,本質是一個操作受限的非負整數。

  下面就來簡單的說一下基本類型的指針。

  我廢話就不多說了,直接上代碼:

 1 #include <stdio.h>
 2 
 3 int main(void){
 4 
 5    int *p;
 6    int i=10;
 7    int j;     
 8 
 9    return; 
10 } 

  以上是一段基本的c語言的代碼,從上面的代碼中我們定義了幾個變量,先從簡單的說,定義一個i變量,且賦值為10,定義了一個j變量,我們沒有賦值。

  剩下的int *p就是重點了,這個該怎么理解呢?就我自己的理解而言,我是這樣理解的,我們看見*號,我們就知道p是一個指針變量,存儲的是地址,前面的int表示的是該指針變量p只能存儲int類型的數據的地址。

  所以就以上解釋,我們就知道了,int *p其實是一個指針變量,該指針變量只能存儲int類型的數據的地址。

  接着看下面一段代碼:

 1 #include <stdio.h>
 2 
 3 int main(int argc, char *argv[])
 4 {
 5     int *p;
 6     int i=10;
 7     int j;
 8     
 9     p=&i;
10     j=*p;
11     printf("j=%d ",j);
12     
13     
14     
15     
16     return 0;
17 }

  在上面這段代碼中,我們又添加了3行代碼,其中printf()是輸出函數,這個不用解釋。p=&i這行代碼的含義是什么呢?通過上面的解釋我們都知道了p其實是一個存儲int類型的地址的指針變量,本着只有相同類型的變量才能互相賦值的原則,我們也可以知道&i也應該是一個地址。其實就是這樣的,“&”這個符號的含義就是取地址的含義,通過這個符號我們就得到了i變量的地址。

  下一行,j=*p,這行代碼也是一個賦值的代碼,根據向左賦值的原則,我們知道*p也是一個int類型的變量,在c語言中*p的作用就是獲取p變量所指向的變量,所以*p其實就是i變量,因為i變量為10,所以,j變量輸出也是10。下圖是代碼的運行結果:

  我們再從下圖中從另一個方向理解:

  從上圖我們可以看出,在內存中變量的地址時不連續的,是由地址總線隨機分配的,因為p是一個指針變量,並且通過取地址的操作,指向了i變量,所以p指針變量存儲的是2000H,即i變量的地址。*p則表示為i變量,通過對j變量賦值,使得j變量成為了10。

  再說一個比較有意思的事情,接着看代碼:

 1 #include <stdio.h>
 2 
 3 
 4 int haha(int *p){
 5     *p=100;
 6 }
 7 
 8 int main(int argc, char *argv[])
 9 {
10     int *p;
11     int i=10;
12     int j;
13     
14     //p=&i;
15     //j=*p;
16     //printf("j=%d ",j);
17     haha(&i);
18     printf("i=%d",i);
19     
20     
21     
22     return 0;
23 }

  上圖中,我們定義了一個haha()函數,其中形參是一個指向int類型的指針變量p,記住:我們的形參是一個地址。所以,在我們調用時,我們應該傳入一個地址,所以我們傳入了&i,是i變量的地址。通過我們上面的講解,大家也應該知道了最終的輸出結果,沒錯就是100:

  通過上面的學習,我們也會知道,其實在我們傳參時傳入的是一個地址,所以,此時直接指向的是我們的變量,當我們在操作時,即賦值是,直接對地址指向的變量賦值,所以我們就已經改變了原變量i的值,所以我們在輸出時輸出的就是100。

  以上就是我對基本類型指針的理解,如果有錯誤的地方也請大家指正,不勝感激!

 

 

此篇博客屬於博主原創,如果轉載請標明出處,謝謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM