星星符號 * 可能是 C 語言裡面最複雜的符號了。 當它出現在兩個數之間 (常數或變數均可),代表乘法運算。例如 x*y。 當它出現在宣告指令之中,例如
int i, *ip;以上指令的意思,是宣告 i 為一個 int 資料型態的變數。 而 ip 也是一個變數,不過它的資料型態是所謂的 int 指標 (int pointer)。 ip 的數值,是一個記憶體的地址編號。 而那個地址編號 (以及它後面連號的三個字元) 裡面儲存的數值, 屬於 int 資料型態。
同理,如果宣告了
則 tp、xp、yp 各是一個變數, 它們自己的數值是一個記憶體號碼,假如char *tp; float *xp; double *yp;
則知道tp == 4026530503 xp == 4026530492 yp == 4026530480
前述的 tp、ip、xp、yp 四個變數,
我們稱指標資料型態是衍生的資料型態 (derived types)。 它們是由基本資料型態衍生出來的。 就好像序列,也都是衍生的資料型態, 簡記做 char[]、int[]、float[]、double[] 等等。int* ip, iq; 等於說 int *ip; 但是不等於說 int *ip, *iq; int iq;
不論 char、int、float、double 這些基本資料型態的含量為何,它們衍生的指標資料型態的含量都一樣大。 但是此大小卻與電腦硬體的設計有關。 如今常見的所謂 32 位元電腦,其指標資料型態的含量是 4 (bytes), 而所謂 64 位元電腦,其指標資料型態的含量通常是 8 (bytes)。 我們可以用 sizeof 指令去探測指標資料型態的含量。
如果宣告了 x 是 char 資料型態的變數, 則 &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 所佔用的記憶體地址編號就是 tp 變數的值, i、x、y 亦類似。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
習題
注意:此處所有文件均為原著,個別的版權宣告日後會一一公布, 整體版面設計亦尚未完成。但仍請勿抄襲文字與圖片,以免觸犯著作權法。
Created: Feb 23, 2001
Last Revised: Feb 28, 2001
© Copyright 2001 Wei-Chang Shann 單維彰