- 1、本文档共42页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
4.3.2 数组的指针访问(续) 认真区分下面的两种“字符串”的不同: char* p = string; char cs[] = string; 虽然p和cs都代表字符串“string”,但数组cs真正“装下”了所有字符,而p只是存储了一个字符串常量的首地址。 p和cs都是char*类型的指针,但p是变量,而cs是常量。 4.4 与指针相关的其它类型 内存中可以存储各种数据,包括整数、浮点数、字符以及指针等,在利用指针指向这些数据时,就形成了指向整数、指向浮点数、指向字符以及指向指针的指针。 4.4.1 指向指针的指针 存储一个指向指针的指针应该定义类型相同的指针变量,基本形式为: type** 指针变量名; double x = 2.5; double* p = x; double** p2 = p; 此时,p2的类型是double**,基类型是double*。 利用这样的指针间接访问x需要更多的“手续”: *p2是p,*(*p2)=*p才是x(可写成**p2)。 这种方式一般称为双重间接引用。 使用const对指针变量定义进行限制的目的是表明p或*p是否允许改变。 * * 第4章 指针、引用与数组 关于内存地址 内存空间的访问方式 通过变量名访问 通过地址访问 指针是内存地址与存储数据的类型相结合的产物。利用指针可以使程序绕过普通变量名读取或修改内存中存储的值。 有利于增强语言的能力和提高程序的效率 但使用错误的地址也会导致不可预测的后果 4.1 指针 4.1.1 指针的概念 1 变量的地址 例如:定义变量 int x(10); 假定程序运行时为x分配的内存空间的首地址(第一个字节的地址)是0x12ff88,则可以认为0x12ff88是一个指向x的指针。 称为取地址运算符,表达式x就是x的地址,或者说指向变量x的指针。 通常,程序中只使用x来表示x的地址,并不需要知道x的实际值是多少。 首先,在程序的两次运行时,分配给x的地址可能并不一致。 其次,表达式x中除了数值0x12ff88之外,还含有此地址所指向的内存中所保存数据的类型信息。 4.1.1 指针的概念(续) 2 指针变量 指针并不是整数。因此,需要使用一种专门的变量——指针变量来存储指针。一般定义形式如下: type* 变量名[=地址表达式]; 例如: char* pc; int* pd; 指针变量的定义清楚地说明了指针的数据类型。 4.1.1 指针的概念(续) 指针反映出两方面的含义 其一是指针的值,即指针指向内存的位置。 其二是利用该指针可以从内存中取出一个什么样的数据,指针类型“type*”中的type恰好说明了这种数据的类型。 由于type决定了通过指针取得的数据类型是否正确,通常称其为指针的“基类型”。 4.1.1 指针的概念(续) 例如,对于如下变量: int x(10); double y(2.3); 利用指针变量可以保存指针的值,如图: int x =10, *px = x; double y =2.3, *py = y; 连续定义指针变量时每个名字之前都要加上*号,如: char* p1, *p2; //如果p2前无*号是字符型变量 4.1.1 指针的概念(续) 注意: 指针间的赋值应严格保证其类型相同。 x与px、y与py的差别只在于前者是常量,而后者是变量。 10 2.3 常量x 变量px 常量y 变量py 指针中“包装”了2种信息 int x double y 0x12ff88 int 0x12ff84 double 4.1.2 指针运算 1 间接访问运算符 * 运算符“*”称为“间接访问”运算符。 “*指针”形式的“新的变量”,此变量对应着指针所指向的存储单元。 若一个指针p的类型为“type*”,则*p是一个type类型的变量,可以作为左值。 char x, *px = x; //x和px都是指向x的指针 int y, *py = y; //y和py都是指向y的指针 *(x)和*px是char类型的变量,完全等同于变量x, *(y)和*py是int类型的变量,与变量y完全相同。 4.1.2 指针运算(续) 与*是一对具有“相反意义”的运算符 x是指向变量x的指针 *(x)是变量x本身 (*(x))又是指向变量x的指针 间接访问运算符也可以用[ ]代替 *px与px[0]具有完全相同的作用。 4.1.2 指针运算(续) 2 指针类型的强制转换 如果要将一个类型不匹配的指针保存在指针变量中,需要经过类型转换。 例如:double x = 2.3; int *p; 由于p与x类型不同,不能直接将x保存在变量p中,但可以先进行类型转换:p=(int
文档评论(0)