一元運算子*是間接定址或間接引用運算子。當它作用與指標時,將訪問指標所指向的物件。我們在這裡假定 x 與 y 是整數,而 ip 是指向 int 型別的指標,下面的**說明了如何在程式中宣告指標以及如何使用運算子&和*:
intx =1
, y =2
, z[
10];
int*
ip;
/*ip is a pointer to int
*/ip =&
x;
/*ip now points to x
*/y =*
ip;
/*y is now 1 */*
ip =
0;
/*x is now 0
*/ip =&
z[0] /*
ip now points to z[0]
*/我們來看指標 ip 的宣告,如下所示:
int *ip;
這樣宣告是為了便於記憶。該宣告語句表明表示式*ip的結果是int型別。這種宣告變數的語法與宣告該變數所在的表示式的語法類似。同樣的原因,對函式的宣告也可以採用這種方式。例如,宣告:
double *dp, atof(char *);
表明,在表示式中,*dp和atof(s)的值都是double型別,且atof的引數是乙個指向char型別的引數。
我們應該注意,指標只能指向某種特定型別的物件,也就是說,每個指標都必須指向某種特定的資料型別。(乙個例外情況是指向void型別的指標可以存放指向任何型別的指標,但它不能間接引用其自身。)。
如果指標 ip 指向整形變數,那麼在 x 可以出現的任何上下文中都可以使用 *ip,因此,語句
*ip = *ip + 10;
將把*ip的值增加10。
一元運算子*和&的優先順序比算術運算子的優先順序高,因此,賦值語句
y = *ip + 1;
將把*ip指向的物件的值取出並加1,然後再將結果賦值給y,而下列賦值語句:
*ip += 1;
則將 ip 指向的物件的值加1,它等同於
++*ip;
或(*ip)++;
語句的執行結果。 語句(*ip)++中的圓括號是必須的,否則,該表示式將對 ip 進行加1運算,而不是對 ip 指向的物件進行加1運算,這是因為,類似於*和++這樣的一元運算子遵循從右至左的結合順序。
最後說明一點,由於指標也是變數,所以在程式中可以直接使用,而不必通過間接引用的方法使用。例如,如果 iq 是另乙個指向整形的指標,那麼語句
iq = ip;
將把 ip 中的值拷貝到 iq 中,這樣,指標 iq 也將指向 ip 指向的物件。
* last edit by old at 2009.12.26
c程式語言_第2版新版.pdf
51指標定義
c51指標型別和儲存區的關係詳解 轉貼 一 儲存型別與儲存區關係 data 可定址片內ram bdata 可位定址的片內ram idata 可定址片內ram,允許訪問全部內部ram pdata 分頁定址片外ram movx r0 256 byte 頁 xdata 可定址片外ram 64k 位址範圍 ...
C語言(九) 指標(3)指標與const
表示一旦得到了某個變數的位址,不能再指向其他變數 int i 0 int const q i q是 const q 20 ok q error表示不能通過指標去修改這個變數 int i 0 int j const int p i const int p 等同於 int const p p 20 er...
指標學習二 指標 位址
通過位址的呼叫來改變變數的值 includevoid f int p void g int k int main void f int p void g int k i 0063fe9c p 0063fe9c p 6 k 26定義乙個變數p,它位於2000單元,該單元存放了變數x的位址1000。此時...