《C與指針》讀書筆記七
在這本書中作者專門討論了數組的下標和指針的關系。而且總結了一個結論:“假定兩種方法都是正確的,下標絕對不會比指針更有效率,但指針有時會比下標更有效率。”這個問題我以前沒有注意到過。并且作者從編譯結果的角度證實自己的結論。
本文引用地址:http://cqxgywz.com/article/201608/295622.htmint array[10] ,a;
for( a =0 ;a < 10; a+=1 )
array[a ] =0;
這是一個數組的初始化,將整個數組初始化為0。array[a ]的定位方法比較特別,按照作者的意思是在計算array[a ]的地址時是arrary的值加上a乘于int的長度值得到的。所以每次數組元素的訪問都包含一次乘法運算。在基礎數字電路中我們知道加法器是比較容易實現的,乘法比較不太容易實現。而且乘法運算指令比加法運算指令周期要長。也就是作者認為下標訪問方法效率有提高的空間。
int array[10] ,*ap;
for( ap = array ;ap < array + 10; ap++ )
*ap = 0;
在for中每次循環只需將ap自增1即可。徹底拋棄了乘法運算。提高了運算效率。但是如果基礎比較薄弱的程序員應該接收不了此種寫法,因為可讀性明顯降低。如果對程序時效和節能方面沒有特殊的要求,那么我建議還是使用易讀性強的編寫方法。
在書的146頁作者介紹一系列優化方法。作者認為最優的復制兩個數組的方法如下:
void try5( )
{
register int *p1, *p2;
for( p1 = x, p2 = y; p1 < &x[SIZE]; )
*p1++ = *p2++;
}
編譯成最終代碼非常簡練。
在該章節最后,作者專門介紹這樣做實際意義。
數組名作為參數傳遞函數時,也就是將數組的首個元素地址復制給了函數的接收參數。通過該參數可以對整個數組進行操作。
作者再次舉例實現了一個字符串復制的函數。
void strcpy( char *buffer, char const *string )
{
while(( *buffer++ = *string)!='

