8.1.1 陣列名
int a;
int b[10];
a是標量,b為陣列。
在c中幾乎所有的陣列名的表示式中,陣列名的值是乙個指標常量,也就是陣列第乙個元素的位址。
不過也不要根據這個得出陣列和指標是相同的結論。陣列具有一些何指標完全不同的特徵。例如,陣列具有確定數量的元素,而指標只是乙個標量。編譯器用陣列名來記住這些屬性。只有當陣列名在表示式中使用時,編譯器才會為他產生乙個指標常量。
注意,這個值是指標常量而不是指標變數。你不能修改常量的值。
只有在兩種情況下,陣列名並不用指標常量來表示—-就是當陣列名作為sizeof操作符或單目操作符&的運算元時;
c = &a[0];
c = a;
這兩條語句所執行的任務是完全一樣的。
int a[10];
int b[10];
b = a ;
這樣賦值是非法的,你不能使用賦值符把乙個陣列的所有元素複製到另乙個陣列。你必須使用乙個迴圈依次賦值。
int a[10];
int *c;
a =c;
這也是非法的,因為a的值是乙個常量,不能被修改。
8.1.2 下標引用
array[subscript]
*( array + ( subscript))
8.1.3 指標與下標
指標表示式和下表表示式可以互換使用。
假定這兩種方法都正確,下標絕不會比指標更有效率,但指標有時會比下標更有效率
8.1.4 指標的效率
指標比下標更有效率,前提是它們被正確地使用。
在開始例子之前首先要注意,不要為了效率上的細微差別而犧牲可讀性。
#define size 50
int x[size];
int y[size];
int i;
int *p1,*p2;
這是函式的下標版本
void try1()
一、改用指標方案
void try2()
這與第乙個版本相比並沒有多大改進。
二、重新使用計數器
void try3()
重新使用了計數器,用於控制迴圈何時退出,這樣可以去除指標減法,並因此縮短目標**的長度。
三、消除計數器
void tyr4()
這個版本**非常緊湊,速度也很快。
總結:
1. 當你根據某個固定數目的增量在乙個陣列中移動時,使用指標變數的效率會更高一點。
2. 宣告暫存器變數的指標通常比位於靜態記憶體和堆疊中的指標效率更高。
3. 如果你可以通過測試一些已經初始化並經過調整的內容來判斷迴圈是否應該終止,那麼你就不需要使用一些單獨的計數器。
4. 那些必須在執行時求值的表示式較之諸如&array[size]或array+size這樣的常量表示式往往代價更高。
8.1.5 陣列和指標
C語言指標詳解 陣列與指標
我們可以在函式實參中直接使用陣列名來使用陣列,陣列元素的指標就是陣列元素的位址。我們又知道陣列名代表陣列首元素的位址。因此 p a 0 p a 這兩條語句是等價的。我們再看一下它的初始化語句 int p a 0 或寫成 int p a 下面介紹下陣列指標的運算 當指標已經指向乙個陣列元素時可以進行 ...
理解陣列與指標
int a 10 a本身是陣列名也是指向第乙個陣列元素的指標。a 1是指向第二個陣列元素的指標。也就是說a這個指標的值就是 a 0 a這個指標和a都指向同乙個記憶體位址,但是 a這個指標的意義卻是指向整個陣列,a 1指向a這個陣列結束後的位置。宣告乙個指標指向來指向這個陣列可以這樣宣告 int p ...
陣列指標詳解 C
陣列指標的意思即為通過指標引用陣列,例如int p 10 此時p是乙個指標變數,指向乙個陣列大小為10的陣列,所以int p 10 即為乙個陣列指標。由於運算子優先順序的優先順序大於 若定義為int p 10 此時該定義為乙個大小為10 用來存放指標的陣列。首先,陣列名並不代表整個陣列,它只是代表陣...