C++学习教程及习题 第五章(6)

2019-06-30 10:19

24 << \25 << \27 \

28 << \29 << \

30 << \31 << \32 << \33 << endl; 34 return 0; 35 }

输出结果:

sizeof c = 1 sizeof(char) = 1 sizeof s = 2 sizeof(short) = 2 sizeof i = 4 sizeof(int) = 4 sizeof l = 4 sizeof(long) = 4 sizeof f = 4 sizeof(float) = 4 sizeof d = 8 sizeof(double) = 8 sizeof ld = 8 sizeof(long double) = 8 sizeof array = sizeof ptr = 4

图 5.17 用sizeof运算符计算存放每种标准数据类型时使用的字节数

sizeof运算符可以用于任何变量名、类型名或常量值。用于变量名(不是数组名)和常量值时,返回存放特定变量或常量类型所用的字节数。注意,如果提供类型名操作数,则sizeof使用的括号是必需的;如果提供变量名操作数,则

sizeof使用的括号不是必需的。记住,sizeof是个运算符而不是个函数。 常见编程错误5.8

如果提供类型名操作数,而不在sizeof操作中使用括号则是个语法错误。 性能提示5.2

sizeof属于编译时的一元运算符,而不是个执行时函数。这样,使用sizeof并不对执行性能遣成不良影响。

5.7 指针表达式与指针算法

指针是算术表达式、赋值表达式和比较表达式中的有效操作数。但是,通常并不是这些表达式中使用的所有运算符都在指针变量中有效。本节介绍可以用指针操作数的运算符及这些运算符的用法。

只有少量操作可以对指针进行。指针可以自增(++)或自减(--),整数可以加进指针中(+或+=),也可以从指针中减去整数(-或-=),指针可以减去另一指针。 假设声明了数组int v[5],其第一个元素位于内存地址3000。假设指针vPtr已经初始化为指向数组v[0],即vPtr的值为3000。图5.18演示了在32位的机器中的这种情况。注意vPtr可以初始化为数组v的指针,如下所示: vPtr = v; vPtr = &v[ 0 ]

图5.18 数组v和指向v的指针变量vPtr 可移植性提示5.4

如今的大多数计算机都是16位或32位,有些较新的计算机用8字节整数。由于指针算法的结果取决于指针所指对象的长度,因此指针算法与机器有关。 按照传统算法,3000+2得到3002。而指针算法通常不是这样。将指针增加或减去一个整数时,指针并不是直接增加或减去这个整数,而是加上指针所指对象长度的这个倍数。这些字节数取决于对象的数据类型。例如,下列语句:

vPtr += 2;

在用4字节内存空间存储整数时得到的值为3008(3000+2*4)。对数组v,这时vPtr指向v[2]如图5.19。如果用2字节内存空间,则上述结果得到

3004(3000+2*2)。如果数组为不同数据类型,则上述语句将指针递增指针所指对象长度的2倍。对字符数组进行指针算法时,结果与普通算法相同,因为每个字符的长度为一个字节。

图 5.19经过指针运算之后的vPtr 如果vPtr递增到3016,指向v[4],则下列语句: vptr -= 4;

将vPtr复位为3000,即数组开头。如果指针加1或减1,则可以用自增(++)和自减(--)运算符。 下列语句: ++vptr; vPtr++;

将指针移到数组中的下一个位置。下列语句: --vPtr; vPtr --;

将指针移到数组中的前一个位置。

指针变量还可以相减。例如,如果vPtr包含地址3000,v2Ptr包含地址3008,则下列浯句:

x = v2Ptr - vPtr;

将x指定为vPtr到v2Ptr的元素个数,这里为2。指针算法只在对数组进行时才有意义。我们不能假设两个相同类型的变量在内存中相邻的地址存放,除非它们是数组的相邻元素。

常见编程错误 5.9

对于不引用数组值的指针采用指针算法通常是个逻辑错误。 常见编程错误5.10

将两个不引用同一数组的指针相加或相减通常是个逻辑错误。 常见编程错误5.11

使用指针算法时超过数组边界通常是个逻辑错误。

如果两个指针的类型相同,则可以将一个指针赋给另一个指针。否则要用强制类型转换运算符将赋值语句右边的指针值转换为赋值语句左边的指针值。这个规则的例外是void的指针(即void),该指针是个一般性指针,可以表示任何指针类型。所有指针类型都可以赋给void指针而不需要类型转换。但是,void指针不能直接赋给另一类型的指针,而要先将void指针转换为正确的指针类型。 void*指针不能复引用。例如,编译器知道int指针指向32位机器中的4字节内存,但void指针只是包含未知数据类型的内存地址,指针所指的字节数是编译器所不知道的。编泽器要知道数据类型才能确定该指针复引用时的字节数。对于void指针,无法从类型确定字节数。

常见编程错误5.12

除了void*类型外,将一种类型的指针赋给另一种类型的指针而不先将一种类型的指针转换为另一种类型的指针是个语法错误。 常见编程错误5.13

复引用void*指针是个语法错误。

指针可以用相等和关系运算符比较,但这种比较只在对相同数组成员进行时才有意义。指针比较是对指针存放的地址进行比较。例如,比较指向同一数组的两个指针可以表示一个指针所指的元素号比另一个指针所指的元素号更高。指针比较常用于确定指针是否为0。 5.8 指针与数组的关系

C++中指针与数组关系密切,几乎可以互换使用。数组名可以看成常量指针,指针可以进行任何有关数组下标的操作。

编程技巧5. 4

操作数组时用数组符号而用指针符号。尽管程序编译时间可能稍长一些.但程序更加清晰。

假设声明了整数数组b[ 5 ]和整数指针变量bPtr。由于数组名(不带下标)是数组第一个元素的指针.因此可以用下列语句将bPtr设置为b数组第一个元素的地址: bPtr = b;

这等于取数组第一个元素的地址,如下所示: bPtr=&b[ O ];

数组元素b[3]也可以用指针表达式引用: *( bPtr + 3 )

上述表达式中的3是指针的偏移量(offset)。指针指向数组开头时,偏移量表示要引用的数组元素,偏移量值等于数组下标。上述符号称为指针/偏移量符号(pointer/offset notation)。括号是必需的,因为*的优先顺序高于+的优先顺序。如果没有括号,则上述表达式将表达式*bPtr的值加上3(即3加到b[0]中,假设bPtr指向数组开头)。就像数组元素可以用指针表达式引用一样,下列地址: &b[ 3 ]

可以写成指针表达式: bPtr + 3

数组本身可以当作指针并在指针算法中使用。例如,下列表达式: *( b + 3)

同样引用数组元素b[3]。一般来说,所有带下标的数组表达式都可以写成指针加偏移量,这时使 用指针/偏移量符号,用数组名作为指针。注意,上述语句不修改数组名,b还是指向数组中第一个元素指针和数组一样可以加下标。例如,下列表达式: bPtr[ 1 ]

指数组元素b[1].这个表达式称为指针/下标符号(pointer/subscript notation)。


C++学习教程及习题 第五章(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:城管执法局创建市级文明单位汇报材料

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: