發信人: ax.bbs@bbs.ee.nthu.edu.tw. (athena), 信區: test
標  題: 星星流講座 0013
發信站: ☆清華電機☆ (Sun May 14 12:17:37 1995)
轉信站: star

星星流講座 0013         C 語言教室

第 3 講 之 6            基本的輸出與輸入
                        Topic: Addressing Operator & casting

C 語言中提供了直接取得變數位址 (address) 的方法,什麼是變數
的位址呢?我們知道變數是用來儲存資料用的,那麼,在程式執行
的時候,這些資料又是被放在那兒的呢?沒錯,就是放在主記憶體
(Main Memory) 中。由於主記憶體很大,所以電腦必須以一種比較
有效率的方法來迅速地取得記憶體中的資料,目前所有的電腦都是
使用定址 (addressing) 的方式來管理記憶體。定址簡單地說,就
是把主記憶分成一個一個的小區域 (通常以 byte 為單位) ,然後
替每個小區域編定一個「地址」。等到要存取資料時,就可以根據
地址去找出資料來,這個「地址」我們就管它叫「位址」。

C 語言由於提供了直接取得變數位址的方法,所以它也被某些人稱
為「中階語言」,這是因為它同時具有高階語言的語法和低階語言
才有控制和操作位址的能力。那麼要如何取得變數位址呢?它的方
法有兩種:一種是使用取址運算子 & (Address Operator) ,另一
種是使用指標 (pointer)。在此我們先介紹如何使用取址運算子。

取址運算子的方法很簡單,請看下面的範例程式:

/* address.c */
#include <stdio.h>

void main (void)
{
    int a;
    printf ("%p\n", (void *)&a);
}
 

執行結果:

effffd0c

這個程式在不同的機器上有不同的執行結果 (在相同的機器上也可
能有不同的執行結果 :) ) ,這是因為變數在執行時所被放置的位
址會有變動,這是作業系統操作導致的關係。

上面的程式中比較值得注意的就是這一行:

        printf ("%p\n", (void *)&a);
 

%p 表示印出的是變數的位址,而 &a 表示的就是 a 這個變數的位
址,所以 & 被叫做取址運算子,就是取得變數位址的意思。那麼
(void *) 這個東西是做什麼用的?這個東西叫做強制型態轉換 (
explicit type conversion,某些原文書中把它簡稱為 casting)
。為什麼要做強制型態轉換呢?我們在前面曾經說過,傳給函數的
參數,它的型態必須和函數原型中規定的相同才行。萬一型態不相
同的時候,那該如何是好呢?這時候就必須使用強制型態轉換了。
強制型態轉換的方法非常簡單,只要在欲轉換的變數前面加上用小
括號括起來的型態就可以了。例如上面的程式中,我們要把 &a
的型態轉成 void * 的型態 (void * 是一個指標型態,指標型態
以後將專文討論),那麼就只要寫 (void *)&a 就完成強制型態轉
換了。以下是另一個比較簡單的使用強制型態轉換的程式:
 

/* type.c */
#include <stdio.h>

void main (void)
{
    int a = 20;                 /* direct assign */
    printf ("%f\n", (float)a);
}

執行結果:

20.000000

我們把 a 的型態強制轉換成 float,然後就可以在 printf 中使
用 %f 的方式把 a 以浮點數的方式印出。上面的程式中同時也示
範了直接給定變數初值的方法。