BBS水木清华站∶精华区

发信人: ax.bbs@bbs.ee.nthu.edu.tw. (athena), 信区: test 
标  题: 星星流讲座 0013 
发信站: ☆清华电机☆ (Sun May 14 12:17:37 1995) 
 
 
第 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 以浮点数的方式印出。上面的程式中同时也示 
□了直接给定变数初值的方法。 
 
 
-- 
本文原作者为徐振家,原作刊载於星星神教总坛 ☆清华电机☆ test 板。 
你可以以电子文件的形式将本文自由流传於台湾学术网路,但必须包含此版权声明。 
原作者依中华民国著作权法之规定,享有本文之著作权,请勿抄袭以免触法。 
未经授权任何人不得以任何形式对本文做任何修改及商业上之应用。 
其他网路的转载或其他用途的应用,请先知会作者,并取得其同意。 
对本文有任何疑问或意见请 mail 给 ax.bbs@bbs.ee.nthu.edu.tw,谢谢。 
 
 

BBS水木清华站∶精华区