Linux 版 (精华区)
发信人: netiscpu (夜☆星光点点☆), 信区: Linux
标 题: ◇ 星星流讲座 0013
发信站: 紫 丁 香 (Sun Nov 8 18:26:54 1998), 转信
寄信人: guest.bbs@hgluo.hust.edu.cn
标 题: ◇ 星星流讲座 0013
发信站: 华南理工大学 BBS木棉站
日 期: Thu Feb 20 14:40:50 1997
发信人: ax.bbs@bbs.ee.nthu.edu.tw. (athena), 信区: test
标 题: 星星流讲座 0013
发信站: ☆清华电机☆ (Sun May 14 12:17:37 1995)
;35m第 3 讲 之 6 基本的输出与输入
Topic: Addressing Operator & castingm
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,谢谢。
--
m;32m※ 转寄:.华南网木棉站 bbs.gznet.edu.cn.[FROM: mtlab.hit.edu.cn]
--
Enjoy Linux!
-----It's FREE!-----
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: mtlab.hit.edu.cn]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.829毫秒