指针变量的运算

指针运算符

指针运算符有两种:

  • 取地址运算符&& 是单目运算符,其结合性为自右至左,功能是取变量的地址。
  • 取内容运算符*: 是单目运算符,其结合性为自右至左,用来表示指针变量所指的变量。在 * 运算符之后跟的变量必须是指针变量。
  • 需要注意的是指针运算符(*)和指针变量说明中的指针说明符(*)不是一回事。在指针变量说明中,“*”是类型说明符,表示其后的变量是指针类型,而表达式中出现的“*”则是一个运算符用以表示指针变量所指的变量。
赋值运算

1) 把一个变量的地址赋予指向相同数据类型的指针变量。例如:

int a, *pa;
pa = &a;

2) 把一个指针变量的值赋予指向相同类型变量的另一个指针变量。如:

int a, *pa = &a, *pb;
pb = pa; // 把a的地址赋值给指针变量pb

3) 把数组的首地址赋予指向数组的指针变量。例如:

int a[5], *p;
p = a; // 数组名表示数组的首地址,可以赋给指针变量
// 也可以写成 p = &a[0] 或 int a[5], *p = a;

4) 把字符串的首地址赋予指向字符类型的指针变量。例如:

char *pc;
pc = "hello world!" // 或者 char *pc = "hello world!"

5) 把函数的入口地址赋予指向函数的指针变量。例如:

int (*pf)();
pf =func; //func为函数名
加减算术

对于指向数组的指针变量,可以加上或减去一个整数n。设pa是指向数组a的指针变量,则pa+n、pa-n、pa++、++pa、pa-、--pa运算都是合法的。指针变量加或减一个整数n的意义是把指针指向的当前位置(指向某数组元素)向前或向后移动n个位置。应该注意,数组指针变量向前或向后移动一个位置和地址加1或减1在概念上是不同的。因为数组可以有不同的类型,各种类型的数组元素所占的字节长度是不同的。如指针变量加1,即向后移动1 个位置表示指针变量指向下一个数据元素的首地址。而不是在原地址基础上加1。例如:

int a[5], *pa;
pa = a; // pa指向数组a,即a[0]
pa += 2; // 指向a[2]
两个指针变量之间的运算

只有指向统一数组的两个指针变量之间才可以进行运算,否则无意义

1) 指针变量相减 两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。实际上是两个指针值(地址)相减之差再除以该数组元素的长度(字节数)。

2) 指针变量进行关系运算 指向同一数组的两指针变量进行关系运算可表示它们所指数组元素之间的关系。例如:

  • pf1==pf2 表示pf1和pf2指向同一数组元素;
  • pf1>pf2 表示pf1处于高地址位置;
  • pf1<pf2 表示pf2处于低地址位置。
  • 指针变量还可以与0比较。设p为指针变量,则p==0表明p是空指针,它不指向任何变量;p!=0表示p不是空指针。
代码示例#2.6.2-指针运算
#include <stdio.h>
int main()
{
    int a = 10, b = 20, sum, product, *pa, *pb;
    pa = &a;  //给指针变量pa赋值,pa指向变量a
    pb = &b;  //给指针变量pb赋值,pb指向变量b
    sum = *pa + *pb;  //求a+b之和,*pa就是a,*pb就是b
    product = *pa * *pb;  //本行是求a*b之积
    printf("a=%d\nb=%d\na+b=%d\na*b=%d\n", a, b, a+b, a*b);
    printf("s=%d\nt=%d\n", sum, product);

    return 0;
}