指標與地址
——《C程式設計語言(第2版-新版)》5.1
一元運算子&可用於取一個對象的地址,因此,下列語句:
p = &c;
將把 c 的地址賦值給變了p,我們稱 p 為“指向”c的指標。地址運算子&只能應用於記憶體中的對象,即變數與數組元素。它不能作用於運算式、常量或 register 類型的變數。
一元運算子*是間接定址或間接引用運算子。當它作用與指標時,將訪問指標所指向的對象。我們在這裡假定 x 與 y 是整數,而 ip 是指向 int 類型的指標,下面的代碼說明了如何在程式中聲明指標以及如何使用運算子&和*:
int x = 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