天天看點

學習C語言的第六天

在學習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開始不停地加一,直到加到最後一個元素為止。

原因在于指針直接指向需通路的資料,不必再通過其它計算來進行間接通路。比如二維數組,想要通路其中的成員計算機必須先做一次乘法運算和一次加法運算,而設計适當的指針通路時就完全不必做這些操作。

這對于新手來說确實比較晦澀難懂,先記住指針運作時間要比數組短就可以了。

繼續閱讀