首页 理论教育C语言指针变量的运算

C语言指针变量的运算

【摘要】:取内容运算符*,又称间接引用运算符,结合性自右而左,用来表示指针变量所指的变量。指针变量定义时,“*”仅表示其后的变量是指针类型变量。图6.5指针的算术操作若设指针变量p 的值为2000,对于整型数据,其长度是2 个字节。然后,通过指针变量升序输出。图6.7指针变量p1 和p2 交换前后的指针方向

在确定指针变量指向某一变量之后,原来对变量的操作也可以用指针变量进行。

1.指针运算符

(1)取地址运算符&。

取地址运算符&是一个单目运算符,结合性自右而左,功能是取变量的地址。

格式:

功能:运算结果是该变量的首地址。

(2)取内容运算符*。

取内容运算符*,又称间接引用运算符,结合性自右而左,用来表示指针变量所指的变量。运算符*后面的变量必须是指针变量。

格式:

功能:取指针变量所指向的变量的值。

说明:取内容运算符“*”与前面定义指针变量时的“*”意义不同。指针变量定义时,“*”仅表示其后的变量是指针类型变量。而取内容运算符*是一个运算符,运算后的值是指针变量所指的变量的值。例如:

这里语句*p=10 有两层含义:首先从指针变量p 中取值,即变量i 的地址;然后在该地址标识的内存单元中存入数据10,如图6.2 所示。

图6.2 取指针变量p 所指的变量中存放的值

【例6.2】通过指针变量访问整型变量。程序如下:

程序运行结果如图6.3 所示。

图6.3 程序运行结果

【例6.3】通过程序显示指针与其所指向的变量之间的关系。程序如下:

程序运行结果如图6.4 所示。

图6.4 程序运行结果(www.chuimin.cn)

说明:

(1)&i 是变量i 的地址,p 指向变量i,因此p 中存放i 的地址,所以在程序中第1 个和第2 个printf 语句输出的都是i 的地址。而*p 是P 指向地址中存放的数,即i 的值。

(2)&*p 运算顺序是,先执行*P,可得到指向地址中存放的值,即i 的值。然后执行&*P,即&i,所以&*p 的运算结果是变量i 的地址。

(3)*&p 运算顺序是,先执行&p,可得p 的地址,然后执行*&p,得到p 的内容,即变量i 的地址,所以*&p 的运算结果也是变量i 的地址。

2.指针变量的算术操作

在C 语言中,允许指针的算术操作只有加法和减法。

例如int n,*p;则表达式p+n 指向的是p 所指的数据存储单元之后的第n 个存储单元,其中数据存储单元的大小与数据类型有关,如图6.5 所示。

图6.5 指针的算术操作

若设指针变量p 的值为2000,对于整型数据,其长度是2 个字节。则表达式p++的运算结果为2002,而不是2001。因为p 增量后,要指向下一数据存储单元。

注意:地址的值可以用2011、2012 等十进制的数表示,也可以用2000H、2001H 等十六进制的数表示。

3.指针变量的增减量运算

在C 语言中,当指针变量指向某一连续存储单元时,可以对指针变量进行++,--运算,达到移动指针的目的。例如:

*p++的操作是先取指针p 的值,然后再将p+1 赋给p,最后对p 取*运算。

*p--的操作也是先取指针p 的值,然后再将p-1 赋给p,最后对p 取*运算。

4.指针变量的应用

【例6.4】输入两个整型数据a 和b,按升序输出,使用指针变量求解。程序如下:

程序运行结果如图6.6 所示。

图6.6 程序运行结果

说明:

(1)定义了三个指针变量p1、p2 和p,在比较和交换的过程中不是交换变量a 和b 的值,而是交换指针变量p1 和p2 的值。然后,通过指针变量升序输出。

(2)最初指针变量p1 和p2分别指向变量a 和b。当a 大于b 时,交换指针,使指针变量p1 指向b,p2 指向a,交换过程如图6.7 所示。

图6.7 指针变量p1 和p2 交换前后的指针方向