- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第8章 地址和指针
指针是C语言中的一个重要概念,也是C语言的一个重要特色。正确而灵活地运用它,可以有效地表示复杂的数据结构;能动态分配内存;能方便地使用字符串;有效而方便地使用数组;在调用函数时能得到多于一个的返回值;能直接处理内存地址等,这对设计系统软件是很必要的。掌握指针的应用,可以使程序简洁、紧凑、高效。
8.1 变量的地址和指针
计算机的内存是以字节为单位的一片连续的存储空间,我们称其为一个存储单元。每个存储单元都有唯一的编号,我们称为内存地址(一般用20位二进制数表示,为书写方便,更多的是用16进制数表示。为的直观性,我们在讨论中用10进制数表示)。由于内在是连续的,所以地址也是连续的。
在程序中,一个变量实质上代表了“内存中的某个存储单元”(当某种类型的变量占用多个字节的内存时,规定用最小的地址来表示)。
若在程序中定义了一个变量,C编译系统会根据定义的变量类型,为其分配若干个字节的存储空间。在VC6.0中,short int型数据占2字节;int型数据和float型数据占4个字节;double型数据占8个字节;char型数据占1个字节;指针型变量占4个字节。
一般情况下,我们在程序中只需要指出变量名,无需知道每个变量在内存中的具体地址,每个变量与其对应的内存单元之间的联系由C编译系统来完成。我们在程序中对变量的存取操作,实际上是对与变量对应的内存单元的操作,这种直接按变量地址存取变量值的方式称为变量的“直接存取方式”。如下图所示。
在C语言中,还可以定义一种特殊的变量,这种变量不是简单地存储一个数值或字符,而是存放某个内存单元的内存地址。这种变量我们称为“指针变量”,它占用4个字节(两个字节用来存放段地址,两个字节用来存放段内偏移地址)。指针变量当然也有它自己的内存地址。
如下图所示,我们定义一个指针型变量p,它自己的地址是(2002),若将变量a的内存地址(1002)存放到变量p中。这时要访问变量a所代表的存储单元,就有两种方法,一种是我们刚才讲的“直接存取方式”,另外一种就是我们先找到变量p的地址(2002),从中取出a的地址(1002),然后再去访问以1002为首地址的存储单元。这种通过变量p间接得到变量a的地址,然后再存取变量a的值的方式称为“间接存取方式”。这种用来存放地址的变量称为“指针变量”。在这种情况下,通常称指针变量p指向了变量a,变量a是指针变量p所指的对象,它们之间的这种“指向”关系是通过地址建立的。
8.2 指针变量的定义和指针变量的基类型
变量的指针就是变量的地址,可以定义一个变量存储该地址,这个变量就称为“指针变量”。为了表示指针变量和它所指向变量之间的联系,用“*”表示指向。
定义指针变量的一般形式如下:
类型名 *指针变量1,*指针变量2,……;
例如:int *pi,*Pj;
定义指针变量时要注意两点:
1、标识符前面的“*”,表示该变量为指针变量,但指针变量名是pi、pj,而不是*pi和*pj。这与前面我们介绍的变量定义有所不同;
2、一个指针变量只能指向同一个类型的变量。例如,pi不能忽而指向一个整型变量,忽而指向一个实型变量。因此必须规定指针变量所指向的变量的类型,这个类型称为指针变量的基类型。换言之,只有同一类型变量的地址才能放到指向该类型变量的指针变量中。
8.3 给指针变量赋值
请牢记,指针变量中只能存放地址(指针),不要将一个整型量(或任何其它非地址类型的数据)赋给一个指针变量。如:
pi=100; (pi为指针变量,100为整数)
8.3.1 给指针变量赋地址值
一个指针变量可以通过不同的方式获得一个确定的地址值,从而指向一个具体的对象。
1、通过求地址运算符()获得地址值
单目运算符用来求出运算对象的地址。例如:
int i=5,j=6; 或 int i=5,j=6,*pi,*pj; 或 int i=5,j=6;
int *pi,*pj; pi=i; int *pi=i,*pj=j;
pi=i; pi=j;
pi=j;
应当注意:求地址运算符只能用于变量和以后介绍的数组元素,不能用于表达式、常量或者被说明为register的变量(关于register说明,在第12章介绍)。因此表达式pi=(i+1)是错误的。看下边程序:
#include stdio.h
void main()
{ int i=5,j=6;
int *pi=i,*pj=j;
printf(%d %d\n,i,j);
printf(%d %d\n,pi,pj);
printf(%d %d\n,*pi,*pj);
}
2、通过指针变量获得地址值
文档评论(0)