pointer 資料型態

星星符號 * 可能是 C 語言裡面最複雜的符號了。 當它出現在兩個數之間 (常數或變數均可),代表乘法運算。例如 x*y。 當它出現在宣告指令之中,例如

int i, *ip;
以上指令的意思,是宣告 i 為一個 int 資料型態的變數。 而 ip 也是一個變數,不過它的資料型態是所謂的 int 指標 (int pointer)。 ip 的數值,是一個記憶體的地址編號。 而那個地址編號 (以及它後面連號的三個字元) 裡面儲存的數值, 屬於 int 資料型態。

同理,如果宣告了

char *tp;
float *xp;
double *yp;
tpxpyp 各是一個變數, 它們自己的數值是一個記憶體號碼,假如
tp == 4026530503
xp == 4026530492
yp == 4026530480
則知道 因為 tpipxpyp 本身也都是變數, 所以它們自己也佔用記憶體, 而 &tp&ip&xp&yp 則分別代表它們自己所在的記憶體地址編號。 至於這個事實有什麼用?對初級的 C 語言程式設計師來說,大概沒有用。

前述的 tpipxpyp 四個變數,

但是要小心,int* 只是「int 指標」的簡寫,它不是一種資料型態。 所以,要注意
int* ip, iq;   等於說   int *ip;   但是不等於說   int *ip, *iq;
                        int iq;
我們稱指標資料型態是衍生的資料型態 (derived types)。 它們是由基本資料型態衍生出來的。 就好像序列,也都是衍生的資料型態, 簡記做 char[]int[]float[]double[] 等等。

不論 charintfloatdouble 這些基本資料型態的含量為何,它們衍生的指標資料型態的含量都一樣大。 但是此大小卻與電腦硬體的設計有關。 如今常見的所謂 32 位元電腦,其指標資料型態的含量是 4 (bytes), 而所謂 64 位元電腦,其指標資料型態的含量通常是 8 (bytes)。 我們可以用 sizeof 指令去探測指標資料型態的含量。

如果宣告了 xchar 資料型態的變數, 則 &x 在觀念上就屬於 char* 資料型態。同理,

其他的基本資料型態亦同。

以下這個簡單的測試程式,列出某些指標資料型態的含量,並且提示讀者, 一個指標變數的值,是另一個變數的地址編號,而指標變數也有自己的地址編號。


#include <stdio.h>
 
/* 測試指標類衍生資料型態  (test-pointer.c) */
main() {
    char t='a', *tp;
    int i=0, *ip;
    float x=1, *xp;
    double y=2, *yp;
    tp = &t;
    ip = &i;
    xp = &x;
    yp = &y;
    printf("t  at %u, i  at %u, x  at %u, y  at %u\n", &t, &i, &x, &y);
    printf("tp =  %u, ip =  %u, xp =  %u, yp =  %u\n", tp, ip, xp, yp);
    printf("tp at %u, ip at %u, xp at %u, yp at %u\n", &tp, &ip, &xp, &yp);
    printf("size of pointers: %u %u %u %u\n", sizeof(char*), sizeof(int*),
           sizeof(float*), sizeof(double*));
}

在此時此刻我的電腦上執行的結果是
t  at 4026530503, i  at 4026530492, x  at 4026530484, y  at 4026530472
tp =  4026530503, ip =  4026530492, xp =  4026530484, yp =  4026530472
tp at 4026530496, ip at 4026530488, xp at 4026530480, yp at 4026530468
size of pointers: 4 4 4 4
可見 t 所佔用的記憶體地址編號就是 tp 變數的值, ixy 亦類似。

習題

[ 前一節 ]‧[ 後一節 ]‧[ 回目錄 ]



注意:此處所有文件均為原著,個別的版權宣告日後會一一公布, 整體版面設計亦尚未完成。但仍請勿抄襲文字與圖片,以免觸犯著作權法。

Created: Feb 23, 2001
Last Revised: Feb 28, 2001
© Copyright 2001 Wei-Chang Shann 單維彰

shann@math.ncu.edu.tw