C语言中的地址类型
第27卷弟6期
V o1.12No.6
平原大学学报
j()URNAIf)FI'IN(iYUANUNI\ERSIrY
2005年12月
【)ec.2O05
C语言中的地址类型
杨延玉
(平原大学信息:£程学院,河南新乡453003)
摘要:本文引入"地址类型"的概念,并使用它剖析了C语言的高维数组中的地址表示机制,
对使用指针变量与数组搭配访问数组元素的规律给出了明晰的结论.
关键词:地址;指针变量;数组;地址类型
中国分类号:I'P312文献标识码:A文章编号:lO08—3944(2005)06一Ol3l—O2
收稿日期:2005一O3—3O修回日期:2005—06一l3
作者简介:杨延玉(1947一),河南沁阳人,副教授,主要从事软件的开发教学研究.
本文在C语言中引入"地址类型"这一概念.
地址也称为指针,指针是有不同数据类型的,所以地
址也应具有各种不同的数据类型.虽然"地址类型"
这一概念并未出现在文献中,但是却是顺理成章的,
自然的,用它解释相关的问题,显得更清晰,准确.
定义地址类型(addresstype)就是该地址对应
的内存单元中的内容的数据类型(指向函数的指针
除外).
例女H:charc,pc;inti,pi;int(pa)E4j,
arE4~;
这里,c是char类型的变量,&c是c的地址,执
行pc一&c后,指针变量pc指向了变量c,pc和&c的值都是地址,且地址类型是char类型(字符型地址).
字符型地址对应的内存单元的大小为1个字节.
i是int类型的变量,&j是变量i的地址,执行
pi=&j后,指针变量pi指向了变量i,pi和&i的值
都是地址,且地址类型是int类型(整型地址).整
型地址对应的内存单元的大小是4个字节.
pa是指向长度为4的一维int数组的指针,pa
的值是这样的一个地址:它对应的内存单元的尺寸
是4×4—16个字节,里边存放的是一个长度为4的
一
维int数组.执行pa一&ar后,pa就指向了数组
变量ar,&ar和pa的值都是地址,且地址类型是int [4]地址(长度为4的一维int数组地址).
1访问内存的充要条件
只提供一个起始地址,只是提供了访问的必要
条件,仍无法对内存进行正确访问,因为不同类型的
数据存储空间的大小和存储方式互不相同.该地址
可以被解释成许多地址类型,从而得到不同的访问
结果.请看下面程序片段:
charp=newchar[8];
intpi,i;floatpf;doublepd;
{or(inti一0;i<8;+十i)
*(p十i)一65+i;
for(i一0;i<8;++i)
COut<<*(P+i);COut<<endl;
pi一(int*)P;
for(i一0;i<4;i++)COut<<*(pi+i)<
<"";court<endl;pf=(float*)P;
for(i一0;i<2;++i);
COLIt<<*(pf+i)<<"";
cOut<<endl:
pd=(double*)P;cout~pd<:<:endl;
)
运行结果如下:
ABCDEFGH
l696ll7475l7989l8503
781.0352l7204057.078l25
1.58398e+40
结论:访问内存的充要条件是既知道内存块的
起始地址又要知道它的地址类型.
2数组中的地址表示机制
2.1一维数组
一
维数组的情况比较简单,数组名a和数组首
元素a[O]的地址&aE0~具有相同的地址值和地址类型,结论是:数组名表示的是一个地址常量,是数
组首元素的地址.
2.2二维数组
对于二维数组的情况,要复杂得多.如果仅仅
用"数组名表示的是数组占用内存块的起始地址"来
下结论,显然是太模糊了.为此,我们设计了如下一
个测试程序.
inta[1o]一{l,2,3,4,5,6,7,8,9,10};
intarr[3][4]一{{ll,l2,13,14},
131?
{2l,22,23,24},{3l,32,33,34}j;
c()Llt<<"a一"(_<a<<"\t&a[O]一"<<a [0]<<endl
<<"a[O]一"<<a[0]<<"\t*a一"<<*a
<<endl;
cout<<''&arr="<<&arr<<endl; cout<<"arr一"<<arr<<",\t.arr[O]一"
<<&arr[O]<<endl;
cout<<"arr[O]一"<~arr[0]<<"\t,&arr [O][O]一"<<&arr[O][O]<<endl;
COUt<<sizeof(*&arr)<<"\t"<<sizeof (*arr)<<"\t"<<sizeof(*&arr[O])
<<"\t"<<sizeof(*arr[O])<<"\t"<< sizeof(*&arr[O][O])<<endl;
COUt<<arr+l<<'\t'<<arr<<endl;
运行结果如下:
a一0xlb26&a[O]一0xlb26
a[O]一l*a—l
8Larr一0xibOe
arr=OxlbOe&arr[O]=OxlbOe
arr[O]=OxlbOe&arr[O][O]=OxlbOe
248822
Oxlbi60xlbOe
让我们来分析程序的运行结果.结果显示arr,
arr[O],&arr[O],&arr[O][O]甚至连&arr的值都是一样的,对它们的解释只能使用地址类型.
我们把arr先看做一维数组,它有三个元素arr
[O],arr[1],arr[2],它们都是一维行数组.数组名
arr的值和地址类型都是和&arr[O]一样的,*arr
和*&arr[O]是对应地址上的变量,sizeof(*arr)和
si'zeof(*&a[O])的值都是8,这正是行数组所占内
存的大小.故arr和&arr[O]的地址类型是int[4]
地址,即长度为4的一维int数组的地址.
由于arr[O],arr[1],arr[2]都是一维数组,所以
它们是各自行数组首元素的地址,即它们分别和
&arr[O][O],&arr[1][O],&arr[2][O]具有相同的地址值和地址类型,亦即int地址.
至于&arr,通过sizeof(*&arr)的值24可以
断定,它是把3X4数组看作一个完整变量时的那个
变量的地址,地址类型是int[3][4].
结论:在C语言中,数组名永远是地址常量,其
值和类型是其首元素的地址值和地址类型,当数组
是高维数组时,必须先把它看作抽象的一维数组,确
定其首元素的数据类型,再确定数组名的地址类型.
2.3地址类型的判定方法
没有直接的判定方法,只能间接的测定.由于typeof array
指针变量是由指针对准的目标的数据类型来定义
的,通过测定目标变量的内存尺寸,即可推断出地址
类型.如程序中sizeof(*arr)的值是8,故arr的地
址类型是int[4].
也可以通过显示(arr+1)和arr的值,由它们的
差值来断定.
3地址类型的应用
当数组(一维数组,二维数组)名作为实际参数,
调用子函数时,子函数的形式参数的设计必须与实
际参数匹配,下面举例说明:
main()中有如下语句
inta[10];
floatb[3][4];
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论