譚浩強老師的《c語言程式設計》第二版,page211頁,有這樣一段話:
引用陣列元素可以用下標法,也可以用指標法,即通過指向陣列元素的指標找到所需的元素。使用指標法能使目標程式質量高(佔記憶體少,執行速度快)。
每次看到這個地方我都有點不解。後來在vc6.0環境下想了個實驗辦法,編寫乙個簡單的控制台程式,利用反彙編工具察看編譯後的**,發現好像不是這樣子的。從下面**看,好像利用指標訪問陣列元素要比下標法要慢。
**如下:
#include
void main()
;int *b=a;
printf("%d",1);
printf("%c",a[0]);
printf("%c",a[1]); *****************使用下標法
printf("%c",*b); *****************指標法
printf("%c",*(b+1)); *****************這幾句話的彙編**
printf("%d",2);
}下面是反彙編的結果:
7: printf("%c",a[0]);
0040b797 mov ecx,dword ptr [ebp-2ch]
0040b79a push ecx ****************這裡是下標法編譯後彙編語句
0040b79b push offset string "%c" (0042001c)
0040b7a0 call printf (00401060)
0040b7a5 add esp,8
8: printf("%c",a[1]);
0040b7a8 mov edx,dword ptr [ebp-28h]
0040b7ab push edx
0040b7ac push offset string "%c" (0042001c)
0040b7b1 call printf (00401060)
0040b7b6 add esp,8
9: printf("%c",*b);
0040b7b9 mov eax,dword ptr [ebp-30h]
0040b7bc mov ecx,dword ptr [eax]
0040b7be push ecx ****************這裡是指標法編譯後彙編語句
0040b7bf push offset string "%c" (0042001c)
0040b7c4 call printf (00401060)
0040b7c9 add esp,8
10: printf("%c",*(b+1));
0040b7cc mov edx,dword ptr [ebp-30h]
0040b7cf mov eax,dword ptr [edx+4]
0040b7d2 push eax
0040b7d3 push offset string "%c" (0042001c)
0040b7d8 call printf (00401060)
0040b7dd add esp,8
在上面程式中,利用下標訪問陣列的語句編譯後的彙編語句只有2句,而利用指標訪問陣列元素編譯後有3句,顯然是利用下標法進行訪問比較快些。所以對譚老師書上的那一段話有些質疑。特在此貼出來,希望有心達人能給我補充下,也給那些關注這些問題的喜歡c語言的新朋友提個問題。
下面用程式實驗
#include
#include
#include
#include
using namespace std;
int g_number = 0;
int main()
;int test_ok = 0;
int* aryend = &ary[arysize-1]; // 結束元素
指標陣列和陣列指標
有關陣列指標和指標陣列容易混淆,本文舉例說明兩者的區別,並加以分析。基本概念 指標 inta 1 int p a 指標的指標 int p2p p 簡單陣列 intb 20 指標陣列 int p 10 指標陣列,含有10個指標元素,即每乙個元素都是乙個指標 陣列指標 int p 10 這個指標用來指向...
指標陣列和陣列指標
理解這兩個概念,當從語言學的語法角度開始,定語 名詞,即 的 語句。指標陣列 指標的陣列 陣列指標 陣列的指標。一 指標陣列 元素為指標的陣列 顧名思義,就是說的首先是乙個陣列吧,然後陣列的元素是指標而已。說明形式為 type pointer array constant1 constant2 co...
指標陣列和陣列指標
該文時自己對指標陣列用法的一點總結,還望高手指點不足原文如下 由於以前對指標陣列不太明白,所以自己寫了 乙個小的測試程式來驗證了自己的猜測,先總結如下 指標陣列,由名字就可以知道的該陣列中的成員都是為指標的。其定義的方法為 char p 5 該初定義乙個包含5個char 型別的陣列的指標,由於p本身...