c訪問數組元素
兩者意思一樣,但是編譯器處理起來不見得一樣。就像樓上的例子a[2]跟*(a+2)是一個意思。但是對於編譯器來說a[2]是一種固定的寫法,因此對於地址偏移什麼的有固定的處理方式,而*(a+2)在語法上應當分解為先算a+2再取值,如果編譯器不優化,完全按照這種定義去編譯的話,那麼就會有先算出a+2這個地址這一步,因此效率要低些。至於編譯優化能不能使兩者一致,那就很難說了。
比如我編了這樣一個程序
int
a[100];
int
b;
int
i,j,k;
for(i=0;i<1000000;i++){
for(j=0;j<100;j++){
for(k=0;k<100;k++){
b=a[0];
}
}
}
和把b=a[0]換成b=*(a)所耗時間一樣。而分別換成b=a[k]和b=*(a+k)後者所耗時間明顯增加很多,前者也有所增加,但比較少。編譯器優化不能用這個語句測試,因為整個會被優化掉。
② C語言里應該怎麼來訪問數組中的元素
用數組下標來訪問
例如,定義一個數組:int a[5]={1,2,3,4,5};
a[0]=1;
a[1]=2;
a[2]=3;
a[3]=4;
a[4]=5;
③ C語言中為什麼要使用指針訪問數組元素
用指針有一些好處:可以再指針上直接進行計算
比如加減指針。
另外當數組作為
參數傳遞
到函數中的時候,用指針是很方便的。
其實數組的名字就是一個指針。
有一本經典的書
《
C專家編程
》
可以幫助理解這個問題。這種基礎問題是非常重要的。
④ 在C語言中,用下標如何訪問數組元素
.以下標引用的方式訪問數組
在使用數組的場合中,我們常見的一種訪問方法是使用下標訪問數組元素,如:array[2] = 1,此語句是將該數組的第三個元素賦值為1.[ ]符號中的數字可以認為是在數組基地址上的偏移量,可以通過改變這個偏移量來訪問整個數組。
2.以指針訪問的方式訪問數組
除了使用偏移量的方法,我們還可以使用指針的方法來訪問數組,即間接引用的方式。如:*(array+2) = 1,同上面的代碼一樣,也是對該數組的第三個元素進行賦值。
3.下標引用和指針訪問的執行效率問題
對於這兩灶螞種不同的訪問數組的方式,它們的執行效率也不同,在這里先給出結論:指針訪問的效率 >= 下標引用的效率。接下來我們來說說,為什麼使用指針進行間接訪問的效率會優於小標引用的效率。
下標引用的效率
現在假設有如下代碼,執行對整個數組的初始化過程:
int array[10];
for(int i = 0;i < 10;i++)
{
array[i] = 0;
}
在這里我們還是假設編譯器中int類型佔4個位元組,在執行array[i] = 0時,編譯器會將其轉化為類似*(array + (i*4)) = 0形式。在整個執行10次的循環中,意味著也進行了10次乘法運算操作和10次加法運算操作。李腔
指針訪問的效率
假設有如下代碼,執行對整個數組的初始化過程:
int array[10];
for(int *ptr = array; ptr < array+10; ptr++)
{
*ptr = 0;
}
這里是將指針一開始指向數組首地址,然後每次向後移動一個數組元素,這里是每次移動4個位元組,即每次對指針地址+4。在整個過程中只進行了10次加法運算。同上對比可得,對於數組操作來說,指針訪問的效率是優於下標引用的。
4.下標引用和指針訪問的優先順序問題
關於這個問題,筆者還是先給出結論,再舉例進行闡述。
結論:下標引用優先順序 > 指針訪問優先順序。
假設我們現在有以下兩隱擾埋個數組的聲明:
int *array1[10];
int (*array2)[10];
關於上述聲明,乍一看很容易混淆,但其實這只是一個關於結合優先順序的問題。在看這些聲明時,需要記住下標優先順序高於指針*,並且如果出現了( ),那麼它的優先順序一定是最高的。
int *array1[10]
在*和[ ]同時出現的時候,我們先結合優先順序高的[ ]來看,即它先聲明了一個含有10個元素的數組array1,然後將剩下的int *組合,可以知道這個數組裡面的每個元素,都是一個指向整型類型的指針變數。也就是說,這是一個含有10個指針變數的指針數組。
int (*array2)[10]
這里的聲明中出現了( ),由於( )的優先順序最高,所以我們先看(*array2),即array2是一個指向某種類型的指針變數。再結合剩下的int [10],可以知道這個指針變數指向的數據類型是含有10個元素的整型數組。也就是說,這是一個數組指針,指向一個10元素整型數組。