指針和數組都是C語言的精髓所在,二者有何聯繫區別?

1.1指針和數組定義程序員

指針和數組都是C語言的精髓所在,對於不少C程序員來講,若是你問這樣一個問題:數組和指針有什麼區別?他們的答案極可能是:」數組和指針不是同同樣東西嗎,他們之間有什麼區別啊?「;確實在極個別的狀況下,數組和指針確實能夠」通用「,可是在卻大多數狀況下,數組和指針是兩個徹底不一樣的C數組

語言特性;函數

首先,咱們分別看一下,指針和數組的定義,以及他們之間的不一樣;優化

指針表示C語言中某種數據類型的數據存儲的內存地址,例如,指向各類整型的指針或者指向某個結構體的指針;指針

數組表示若干個相同C語言數據類型的元素在連續內存中儲存的一種形態;內存

 

1.2數組和指針的區別編譯器

好了,上面即爲數組和指針的簡單定義。在說明數組和指針之間的區別以前,咱們先來看一個實例;io

咱們定義兩個文件:a.c和b.c,其中,編譯

[cpp] view plain copy效率

1. a.c文件:  

2. int array[4] = {1, 2, 3, 4};  

3.    

4. b.c文件:  

5. #include <stdio.h>  

6.    

7. extern int *array;  

8.    

9. int main(void)  

10. {  

11.     int i = 0;  

12.     for (; i <4; i++) {  

13.        printf("*array = %d", *array++);  

14.     }    

15.     return 0;  

16. }  

 

咱們編譯運行上面的示例程序,不出意外其沒法運行。可能有的人很不理解其中緣由,他們找不出問題的緣由。其實根本緣由就是他們認爲數組和指針是相同的!其將array定義爲一個4個int元素的數組,可是在b.c中卻又將其聲明爲int型指針。其實數組和指針只是在特定的上下文環境下能夠認爲相同,通常狀況下,他們是不一樣的數據類型,就像float和int類型不一樣同樣。

 

下面逐步分析數組和指針之間的區別:

數組和指針本質上都表明一塊內存,數組比較」直接「,數組名即表明這塊內存的地址,而指針比較」含蓄「,其自己不表明任何有意義的內容,只有給它賦值後,它才真正的表示一塊有意義的內存地址。這就引出了指針和數組的一個區別:定義的時機不一樣;數組在編譯時就已經被肯定下來,而指針直到運行時才能被真正的肯定到底指向何方。數組就比如生在帝王家同樣,一輩子來就有了屬於本身的封地、財富(內存),而指針須要通過編譯、連接、運行時等重重考驗才能得到屬於本身的財富(內存)。可是,數組的這些身份(內存)一旦肯定下來就不能輕易的改變了,它們(內存)會伴隨數組一輩子;而指針則有不少的選擇,在其一輩子他能夠選擇不一樣的生活方式,好比一個字符指針能夠指向單個字符同時也可表明多個字符等。

 

由數組和指針的上述區別引出了它們的之間的另外一個區別:訪問方式不一樣;因爲數組名直接表明其身份(數組在內存中的地址),而指針須要間接才能知道本身的身份(經過讀取其保存的地址),因此它們的對於本身」財富「的訪問方式天然就不一樣了,數組爲直接方式,而指針位間接訪問。經過下面幾幅圖來講明,數組和指針對於自身元素的訪問方式的不一樣:

 

 

2.再論數組

 

2.1數組和指針什麼時候相同

 

圖2-1展現了數組和指針什麼時候相同: 

圖2-1,中說明了數組除了在做爲函數參數或者在表達式中做爲右值,其餘狀況狀況下其與指針均不相同。 

圖2-1,中說明了數組除了在做爲函數參數或者在表達式中做爲右值,其餘狀況狀況下其與指針均不相同。

C語言標準對於數組和指針什麼時候相同定義幾條規則:

Ø  規則1:表達式中的數組名(與聲明不一樣)被編譯器看成一個指向數組第一個元素的指針。

Ø  規則2:下標老是與指針的偏移量相同。

Ø  規則3:在函數參數的聲明中,數組名被編譯器看成指向該數組第一個元素的指針。

簡而言之,數組和指針的關係很有點像詩和詞關係,它們都是文學性之一,有很多共同之處,但在具體的表現形式上又各有特點。下面具體介紹這幾條規則的具體含義。

 

2.1.1 規則1

組合規則1和規則2,就是對於數組下標的引用老是能夠寫成「一個指向數組的起始地址的指針加上偏移量」。例如,假如咱們聲明以下:

 

int a[10], *p, i = 2;

就能夠經過下面任何一種方式訪問a[i]:

 

p = a;p[i];

p = a;*(p+i);

p = a + i;*p;

    

記住:在表達式中,指針和數組是能夠互換的,由於它們在編譯器裏的最終形式都是指針,而且都是能夠進行取下標操做。

 

2.1.2 規則2

數組下標和指針老是相同的,爲何要這麼說呢?你們可能據說過,在編寫程序時,對於數組訪問應該寫成指針的形式,由於這樣能夠提升效率。對於現代的編譯器而言,這個說法通常是錯誤的!現代編譯器對於數組的訪問都會自動優化爲其對應的指針加偏移量的形式,因此也就沒有哪一種形式效率更高的說法了。實際上,數組的訪問之因此改寫爲指針加偏移量的方式,是由於其爲系統底層最基本的工做方式。

相關文章
相關標籤/搜索