- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
chapter05-数组、指针与结构体
5.3 指针 5.3.1 什么是指针 5.3.2 指针变量的声明和初始化 5.3.3 指针操作 5.3.4 指针和数组 5.3.5 sizeof运算符 5.3.6 结构体指针变量 5.3.7 动态分配/释放内存 5.3.8 const指针 5.3.1 什么是指针 计算机中的每个数据都是存放于从某个特定的地址开始的一个或若干个内存单元中,这个特定的地址就称作数据的存储地址。 数据存取是通过变量名实现的,每个变量名都有唯一的地址与其对应,读取变量的过程实质上就是读取储在某个地址上的数据的过程。 指针是一个对象的内存地址,它指向某个对象。 指针与地址密不可分,但在概念上仍有区别。指针所指向的地址总是为保存特定类型的数据而准备的,因此指针不但是数据的存储位置,还标示了该数据的类型。可以说:指针是特定类型数据的地址。 如果一个指针不指向任何数据,则称为空指针,其地址值是0,可以用符号常量NULL表示。空指针是不能存放任何地址的。 5.3.2 指针变量的声明和初始化 存储指针的变量称为指针变量。 每个指针变量都有一个与之关联的数据类型,该数据类型决定了指针变量所指向的对象的类型。 指针变量的定义形式为: 数据类型是指针变量所指向对象的数据类型,它可以是基本数据类型,也可以是构造数据类型以及void类型。 变量名是用户自定义的标识符. “*”表示声明的变量是一个指针变量,而非普通变量。 数据类型 *变量名; 声明指针变量时“*”可以居左,居右或是居中。 例如: int* ip; char *cp; double * dp; 注意:连续声明指针变量和其他变量时,要特别注意切莫混淆。 例如:string *ps1, ps2; ps1是指向字符串变量的指针,ps2为字符串变量 5.3.2 指针变量的声明和初始化 对指针变量进行初始化时只能用以下四种类型的值: 0值; 类型匹配的对象的地址; 另一对象之后的下一地址; 同类型的另一个有效指针; 例如: int i=0, zero=0; int *pi; pi=0; //正确,第一种类型 pi=i; //正确,第二种类型 int *qi=zero+1; //正确,第三种类型 pi=qi; //正确,第四种类型 int *pi=ival; //错误,指针的内容必须为地址 建议:将指针变量的声明和初始化写在一个语句中 C++语言无法检测指针变量是否未被初始化,也无法区分有效地址和由指针变量分配到存储空间中存放的二进制位形成的地址。建议程序员将指针变量的声明和初始化写在一个语句中。 如果必须分开声明指针变量和指针变量所指向的对象,那么将指针变量初始化为0。因为编译器可以测出0值的指针,程序可判断该指针变量并未指向一个对象。 现代C++程序采用vector类型和迭代器取代一般的数组,采用string类型取代C风格的字符串数组。 进一步解释: 指针指向的实体,可以通过对指针变量的间接访问操作来读写该空间的内容。(在指针变量前面加*表示对指针指向内容的访问) 例如: int i=18; int *ip= i; cout”指针变量ip的间接访问值为:“*ip” i的值为:” i endl; *ip=12; cout” 指针变量ip的间接访问值为:”*ip” i的值为:” i endl; 5.3.3 指针操作 指针变量存放的是地址,因此指针变量的运算实际上就是地址的运算。 指针变量通常进行下列几种运算:赋值运算、取值运算、算术运算、相减运算、比较运算。 (1)*和运算 “*”称为指针运算符。 “*”出现在变量声明语句中时,“*”在数据类型与变量之间,是一个二元运算符,用来声明指针变量。 例如:int *pi; “*”出现在指针变量表达式左边时,是一个一元运算符,表示访问指针变量所指对象的内容。 例如:cout*pi //表示读取pi所指的int型对象的值。 “”出现在变量左边时,是一个一元运算符,表示取变量的地址。 操作的对象只能是值,不能是变量表达式. “”运算符常与“*”运算符搭配使用。 (2)指针变量自增、自减运算 指针变量的自增、自减运算是指针变量加减运算的特例。 指针变量的自增或自减表示指针从当前位置向后或向前移动数据类型长度的存储单元。 (3)两指针变量相减 当两个指针指向同一数组时,两个指针变量的相减才有意义。 两个指针变量相减的结果为一整数,表示两个指针之间数组元素的个数。 (4)void*指针 void *指针,它可以保存任何类型对象的地址。 例如: double PI= 3.14 double *pd=PI; void *pv=pd; //void指针可以指向任意类型对象的地址 (5)指向指针变量的指针 由于指针变量本身也为具有存储空间的实体,因而可以被别的指针变量使
文档评论(0)