指针运算

来源:互联网 发布:sql select语句例子 编辑:程序博客网 时间:2024/05/22 09:38

 

一、算术运算

1、指针+-整数

      标准定义这种形式只能用于指向数组中某个元素的指针,并且这类表达式的结果类型也是指针。

      数组的元素在内存中存储时为连续存储,后面元素的地址大于前面元素的地址。当一个指针和一个整数量执行算术运算时,整数在执行加法运算前始终会根据合适的大小进行调整。例如,如果一个整形指针加1,则运算结果产生的指针将指向内存中的下一个整形,即跳过一个整形的大小;若一个整形指针加3,则这个指针将跳过3个整形的大小,即12个字节;如果一个指针减去3,则这个指针将向左移动三个元素的位置。

       例:

            用一个循环,将一个数组全部初始化为0。

            

#include<stdio.h>#define N_VALUES 5int main(){ float values[N_VALUES] = { 1, 2, 3, 4, 5 }; float *vp; for (vp = &values[0]; vp < &values[N_VALUES];)  *vp++ = 0; return 0;}


      循环结束后,指针指向最后一个元素的后面的那个内存的位置。指针可以合法的获取这个值,但对它进行间接访问时可能以外的访问原先存储于这个位置的变量,所以,一般情况下,不允许对指向这个位置的指针执行间接访问操作。

2、指针-指针

      只有当两个指针都指向同一个数组中的元素时,才能用一个指针减去另外一个指针。

      减法运算的结果将除以数组元素类型的长度,即两个指针在内存中的距离(以数组元素的长度为单位,而不是以字节为单位)。

      例1

p1指向arr[i],p2指向arr[j],则p2-p1的值就是j-i的值。

      例2

假定数组类型为float,每个元素大小为4个字节,若数组的起始位置为1000,p1的值是1004,p2的值是1024,则p2-p1的值为5,因为两个指针的差值(20)需除以每个元素的长度(4)。p1-p2也是合法的,其值为-5。

二、关系运算

可用下列关系操作符对指针进行比较(指针都指向同一数组中的元素):

<   <=   >   >=

比较表达式将告诉你那个指针指向数组中更前或者更后的元素。

或者可以在两个任意的指针间执行相等或不相等测试,此类比较结果和编译器在何处存储数据并无关系——指针要么指向同一个地址,要么指向不同的地址。

例1:

    清除数组中所有的元素

#include<stdio.h> #define N_VALUES 5int main(){int values[N_VALUES] = {100,101,102,103,104};int *vp;for (vp = &values[0]; vp < &values[N_VALUES]; ){*vp++ = 0;}return 0;}

例2:

    反向清除数组中的每个元素

#include<stdio.h>#define N_VALUES 5int main(){int values[N_VALUES] = {1,2,3,4,5};int *vp;for (vp = &values[N_VALUES]; vp > &values[0];){*--vp = 0;}return 0;}

将*--vp简化后

#include<stdio.h>#define N_VALUES 5int main(){int values[N_VALUES] = {1,2,3,4,5};int *vp;for (vp = &values[N_VALUES-1]; vp >= &values[0];vp--){*vp = 0;}return 0;}

 此程序存在一个问题,在数组第一个元素在被清除后,vp的值还将减去1,而接下去的一次比较运算是用于结束循环的,而比较表达式vp>=&values[0]是未定义的,因为vp移到了数组边界之外。

标准允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针进行比较,但不允许与指向数组第一个元素之前的那个内存位置的指针进行比较。

原创粉丝点击