數組元素的訪問方式—指針與下標

數組元素的訪問方式—指針與下標

《c和指針》中有一句話:下標絕對不會比指針更有效率,但指針有時會比下標更有效率!

在解釋這句話之前說上一句自己的想法:效率很重要,但是不能僅僅爲了提高點效率而犧牲某些比較重要的優勢,比如可讀性,很顯然,在數組訪問時,使用下標的的訪問方式比指針的可讀性更強,而有時指針正是程序錯誤的根源!

下面解釋下這句話:

下面的例子中將數組中的所有元素都設置爲0:
例1:
(1)數組下標:

int array[10], a;
for(a = 0; a < 10; a += 1)
     array[a] = 0;

    爲了對下標表達式求值,編譯器在程序中插入指令,取得a的值,並把它與整形的長度(也就是4)相乘。這個乘法需要花費一定的時間和空間。

(2)指針:

int array[10], *ap;
for(ap = array; ap < array + 10; ap++)
     *ap = 0;	

     ap++中,++其實就是在ap當前指針所指的位置處,加上一個ap所指元素的類型的長度,這裏就是int,即4。也就是1必須與整形的長度(也就是4)相乘,然後再與指針相加。

   從這裏,貌似兩個循環都進行了乘法,好像沒有什麼差異。可是,你注意到沒有2個循環其實是有很大的不同的。不同在哪裏呢???
   仔細看,會發現數組下標中的a每次的值是不同的,每次a都會與長度4進行相乘,即進行了10次乘法。
   再看看指針,你會發現ap++時,是1與長度4進行相乘,再與指針相加。每次執行乘法時,其實就是1*4。這個乘法只在編譯時進行了一次運算。程序執行的時候,就沒有進行乘法運算,只是簡單的將4與指針相加而已。
   
    指針比下標更有效率的一個典型。你會發現在這個場合中 -- 當你在數組中1次1步(或某個固定的數字)地移動時,與固定數字相乘的運算在編譯時完成,所以運行時所需的指令就少一些。在絕大多數機器上,程序竟會更小一些、更快一些。
    
    下面,我們再說一個指針與下標的效率完全相同的場合。
     例2:
    (1)數組下標:
         a = getValue();
         array[a] = 0;
    (2)指針:
          a = getValue();
          *(array + a) = 0;
    
    這個例子中,a可能是任何值,在運行時纔會得知。2個方案都必須進行乘法指令(因爲a是運行時得到的),用於對a的值進行調整。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章