C语言指针的运算
本文讨论使用指针进行的运算,最重要的运算是获取指针所引用的对象或函数。也可以比较指针,使用指针来遍历一个内存区域。
使用指针读取与修改对象
间接运算符 * 生成内存中的位置,该位置的地址存储在一个指针中。如果 ptr 是一个指针,那么 *ptr 就是 ptr 所指向的对象(或函数)。
使用间接运算符有时候被称为解引用(dereferencing)一个指针。指针指向的内存位置被认为存储有一个对象,指针的类型决定了该对象的类型。例如,当用 int 指针获取一个特定内存位置,读出或写入的也是 int 类型的对象。
与乘法运算符 * 不同,间接运算符 * 是一元运算符,也就是说,间接运算符只有一个操作数。在例 1 中,ptr 指向变量 x。因此,表达式 *ptr 等效于变量 x 本身。
【例1】解引用一个指针
double x, y, *ptr; // 两个double变量和一个double指针 ptr = &x; // 使得ptr指向x *ptr = 7.8; // 对变量x赋值7.8 *ptr *= 2.5; // 将x乘以2.5 y = *ptr + 0.5; // 将加法x+0.5的结果赋值给y
不要混淆指针声明中的星号(*)和间接运算符。声明中的语法可以被视为展示了如何使用指针。如下例所示:
double *ptr;
如上述声明,ptr 具有 double* 类型(读为:“指向double的指针”)。因此,表达式 *ptr 类型是 double。
当然,间接运算符 * 必须匹配一个具有有效地址的指针。这个用法要求在编写程序时需要特别小心!例 1 中,如果没有 ptr=&x 为 ptr 分配有效地址,那么所有包含 *ptr 的语句都是没有意义的(解引用一个没有定义的指针),有可能会造成程序崩溃。
一个指针变量,其本身也是内存中的一个对象,也就是说,其他指针可以指向该指针。若想创建指针的指针,必须使用两个星号,如下例所示:
char c = 'A', *cPtr = &c, **cPtrPtr = &cPtr;
表达式 *cPtrPtr 当前生成 char 指针 cPtr,而 **cPtrPtr 的值是 char 变量 c。图 1 展示了这样的关系。
发表评论