当前位置: 首页 > 文档资料 > C++大学教程 >

5.3 指针运算符

优质
小牛编辑
149浏览
2023-12-01

&(地址)运算符是个一元运算符,返回操作数的地址。例如,假设声明:

int y = 5;
int *yPtr;

则下列语句:

yPtr = &y;

将变量y的地址赋给指针变量 yPtr。变量 yPtr 指向 y。图 5.2 显示了执行上述语句之后的内存示意图。图中从指针向所指对象画一个箭头.表示“指向关系”。

图5.3显示了指针在内存中的表示,假设整型变量 y 存放在地址 600000,指针变量 yPtr 存放在地址 500000。地址运算符的操作数应为左值,(即要赋值的项目,如变量名).地址运算符不能用于常量、不产生引用的表达式和用存储类 regtster 声明的变量。

* 运算符通常称为间接运算符(indirection operator)或复引用运算符(dereferencing operator),返回操作数(即指针)所指对象的同义词、别名或浑名。例如(图5.2再次引用),下列语句:

cout << * yPtr << endl;

指向变量 y 的值(5),如同下列语句:

cout << y << endl;

图 5.2 指针指向内存中整数变量的示意图

这里使用 * 的方法称为复引用指针(dereferencing a pointer)。注意复引用指针也可以用于赋值语句左边,例如下列语句:

*yPtr = 9;

将数值9赋给图 5.3 中的y。复引用指针也可用于接收输入值,例如:

cin>> *yPtr;

复引用的指针是个左值。

yptr y
500000 600000 600000 5

图 5.3 指针在内存中的表示

常见编程错误 5.2
如果指针没有正确地初始化或没有指定指向内存中的特定地址,则复引用指针可能造成致命的运行时错误,或者意外修改重要数据。虽然运行完程序,但得到的是错误结果。

常见编程错误 5.3
复引用非指针是个语法错误。

常见编程错误 5.4
复引用0指针通常是个致命的运行时错误。

图5.4的程序演示了指针运算符。本例中通过 << 用十六进制整数输出内存地址(十六进制整数见附录 数值系统)。

可移植性提示 5.1
输出指针的格式与机器有关,有些系统用十六进制整数,而有些系统用十进制整数。

注意a的地址和 aPtr 的值在输出中是一致的,说明a的地址实际赋给了指针变量 aptr。& 和 * 运算符是互逆的,如果两者同时作用于 aPtr,则打印相同的结果。图 5.5 显示了前面所介绍的运算符的优先级和结合律。

1 // Fig. 5.4: fig05_04.cpp
2 // Using the & and * operators
3 #include <iostream.h>
4
5 int main()
6{
7 int a; // a is an integer
8 iht *aPtr; // aPtr is a pointer to an integer
9
10 a = 7;
11 aPtr = &a; // aPtr set to address of a
12
13 cout << "The address of a is "<< &a
14 << "\nThe value of aPtr is" << aPtr;
15
16 cout << "\n\nThe value of a is "<<a
17 << "\nThe value of *aPtr is" << *aPtr;
18
19 cout << "\n\nShowing that * and & are inverses of"
20 << "each other.\n&*aPtr =" << &*aPtr
21 << "\n*&aPtr =" << *&aPtr << endl;
22 return 0;
23 }

输出结果:

The address of a is Ox0064FDF4
The value of aPtr is 0x0064FDF4
The value of a is 7
The value of *aPtr is 7
Showing that * and & are inverses of each other.
&*aPtr = 0x0064FDF4
*&aPtr = 0x0064FDF4

图 5.4 & 与 * 指针运算符

运算符结合律类型
() []从左向右括号
++ -- + - static_cast()从右向左一元
& * * / %从左向右
+ -从左向右
<< >>从左向右插入/读取
< <= > >=从左向右关系
== !=从左向右相等
&&从左向右逻辑 AND
||从左向右逻辑或
?:从右向左条件
= += -= *= /= %=从右向左赋值
,从左向右逗号

图 5.5 运算符的优先级和结合律