在學習C語言的第五天裡,我已經接觸到了C語言的重點也是難點——指針,今天是我學習C語言的第六天,在今天的學習中我将會加深對指針的了解以及應用。
下面是我自己寫的幾個例題:
例1:
#include <stdio.h>
int main(int argc, char **argv)
{
int a[]={
};
printf("%0x %0x %0x",a,a+,&a+);
return ;
}
這個程式最後列印的是3個位址。
這是我列印出來的結果:bf89d018 bf89d01c bf89d024
我們知道一般列印位址用的都是16進制,即%0x。
首先列印出來a的位址是随機的,那後面2個位址是怎麼來的呢?
首先分析a+1:
因為我定義了一個整型數組a[3],a+1相當于在a的位址上往後移一位,那為什麼不是1呢?因為我定義的是整型數組,往後移動一位相當于跨過一個整型元素,即4個位元組。如果我定義的是字元型數組,它也是往後移一位,但此時因為是字元型數組,是以跨過一個元素隻有1個位元組。
下面來分析下&a+1:
前面說我們定義了一個整型數組a[3],a就是一個位址,那麼在前面又加了一個取位址是什麼意思呢?它就相當于把a[3]這個數組當成一個位址,這個數組裡面有3個元素,每個元素占4個位元組,是以對于&a+1,這時候加一就相當于要跨過一個a[3]數組,即12個位元組。
例2:
#include <stdio.h>
int main(int argc, char **argv)
{
clock_t start;
clock_t end;
int i,k;
int a[],b[];
int *pa=NULL,*pb=NULL,*pEnd=&a[];
start=clock();
for(k=;k<;k++)
for(i=;i<;i++)
b[i]=a[i];
end=clock();
printf("Index Timing:%d\n",end-start);
start=clock();
for(k=;k<;k++)
for(pa=a,pb=b;pa<pEnd;)
*pa++=*pb++;
end=clock();
printf("Pointer Timing:%d\n",end-start);
return ;
}
這個程式的目的是為了比較指針和數組通路資料哪個更快,為了更好的計較,我們将循環擴大到了10000。
列印結果:
Index Timing:360000
Pointer Timing:280000
說明指針的速度要比數組快。
大家也可以再把數字擴大10倍看看。
列印結果:
Index Timing:33470000
Pointer Timing:29890000
你會發現還是指針快。
那這是為什麼呢?
按照我們正常的了解,我們如果定義好了一個整型數組a[6],假如我們要通路a[5]元素,就可以直接找到a[5]這個元素,即随機存取(就是要找數組中指定的某個元素,可以根據數組首位址計算出這個元素的位址,根據位址直接通路,而沒必要逐個元素查找過去)。而指針還要從首位址a開始不停地加一,直到加到最後一個元素為止。
原因在于指針直接指向需通路的資料,不必再通過其它計算來進行間接通路。比如二維數組,想要通路其中的成員計算機必須先做一次乘法運算和一次加法運算,而設計适當的指針通路時就完全不必做這些操作。
這對于新手來說确實比較晦澀難懂,先記住指針運作時間要比數組短就可以了。