指针操作符与运算

来源:互联网 发布:淘宝自定义装修教程 编辑:程序博客网 时间:2024/06/14 18:59

指针操作符与算数运算

和用其它一些基本类型声明的变量一样,指针变量同样有相对应的操作符,它同样可以进行算数运算。

指针操作符

  • 声明和解引:*
    ‘*’操作符有两个作用,一个是声明指针变量,如:
int* p;

同时,它也能解引指针(间接访问)。何为间接访问?通过一个指针访问它所指向的地址的过程。如:

int num = 1;  int *pi = #
  • 强制类型转换:()
    在对指针分配内存时,经常用到强制类型转换:
int * p = (int *)malloc(sizeof(int));
  • 指向:->
    -> 指向操作符用来访问指针引用的结构体的成员:
struct person{    int age;    char name[10];}...struct person *xiaoming;xiaoming->age = 10;
  • 算数运算:+,-

  • 关系运算:>, >=, <, <=, !=, ==

算数运算

指针的算数运算只有加法和减法。同时,它还有一些限制:

  • 只能用于指向数组中某个元素的指针或获得动态分配内存的指针
  • 只能进行指针和整数的加减以及进行指向同一个数组中元素的指针相减。

为什么会这样呢?明明我们知道运算的结果啊?这是因为对指针进行算数运算后,它的结果肯定是一个指针,但是,这个指针指向的究竟是什么? 它是一个,整型变量呢,还是浮点型呢,或者是一条指令? 总所周知,数组有这样一个特性:它是顺序存储的,它的地址在内存上是连续的。因此,对指向数组中某个元素的指针进行算数运算相对很安全,因为我们知道运算结束后,到底是什么东西存储在结果所指向的地址。

指针与整数的运算

指针与整数的加减法公式为:结果(地址) = n * sizeof(数据类型)。如:

int arr[2] = {1,2};printf("%p\n",arr);//打印arr的值printf("%p\n",arr+1);

运行后可以看见,两个地址相差了4,正好是32位整型(int)的大小。
用上述方法也可以来访问数组各个成员。

两个指针相减

只能对指向相同数组内部元素的指针进行减法操作,返回的值 = 地址差值/数据类型。

    int arr[2] = {1,2};    int *p,*q;    p = &arr[1];    q = &arr[0];    printf("%p\n",p);    printf("%p\n",q);    printf("%d",p - q);

这段代码可以打印出同一个数组中两个元素位置差值。
如果随意使用两个指针变量相减,结果是错误的,因为计算机不知道,这两个地址之间的内存中存储的值的类型。

关系运算

大小比较(>, >=, <, <=)

对两个指针变量的值进行大小比较的前提是它们都指向同一个数组里的元素。这里有一个大小比较应用的例子(例程来自《C与指针》),作用是清除一个数组中所有的元素:

#define N_VALUES 5float values[N_VALUES];float *vp;for(vp=&values[0]; vp<values[N_VALUES]; )    *vp++ = 0;

等于判断(==,!=)

0 0