zoukankan      html  css  js  c++  java
  • 指针的高阶用法——指针的算术运算

    指针是一个用数值表示的地址。因此,您可以对指针执行算术运算。可以对指针进行四种算术运算:++、--、+、-。

    假设 ptr 是一个指向地址 1000 的整型指针,是一个 32 位的整数,让我们对该指针执行下列的算术运算:

    ptr++;
    

    在执行完上述的运算之后,ptr 将指向位置 1004。这个运算会在不影响内存位置中实际值的情况下,移动指针到下一个内存位置。而这个移动的位置大小根据数据类型的大小决定。同样,如果 ptr 指向一个地址为 1000 的字符,上面的运算会导致指针指向位置 1001,因为下一个字符位置是在 1001。

    递增一个指针

    数组可以看成一个常量指针,因为数组名本身就是一个指针,但是数组不能递增,递增的话回到另一个内存储存的变量,而不是访问数组的下一个元素。故而我们使用更为方便的变量指针来代替数组。
    下面的程序递增变量指针,以便顺序访问数组中的每一个元素:

    #include <stdio.h>
    
    const int MAX = 3;
    
    int main ()
    {
       int  var[] = {10, 100, 200};
       int  i, *ptr;
    
       /* 指针中的数组地址 */
       ptr = var;
       for ( i = 0; i < MAX; i++)
       {
    
          printf("存储地址:var[%d] = %x
    ", i, ptr );
          printf("存储值:var[%d] = %d
    ", i, *ptr );
    
          /* 移动到下一个位置 */
          ptr++;
       }
       return 0;
    }
    

    当上面的代码被编译和执行时,它会产生下列结果:

    存储地址:var[0] = bf882b30
    存储值:var[0] = 10
    存储地址:var[1] = bf882b34
    存储值: var[1] = 100
    存储地址:var[2] = bf882b38
    存储值:var[2] = 200
    

    递减一个指针

    同样地,对指针进行递减运算,即把值减去其数据类型的字节数,如下所示:

    #include <stdio.h>
    
    const int MAX = 3;
    
    int main ()
    {
       int  var[] = {10, 100, 200};
       int  i, *ptr;
    
       /* 指针中最后一个元素的地址 */
       ptr = &var[MAX-1];
       for ( i = MAX; i > 0; i--)
       {
    
          printf("存储地址:var[%d] = %x
    ", i-1, ptr );
          printf("存储值:var[%d] = %d
    ", i-1, *ptr );
    
          /* 移动到下一个位置 */
          ptr--;
       }
       return 0;
    }
    

    当上面的代码被编译和执行时,它会产生下列结果:

    存储地址:var[2] = 518a0ae4
    存储值:var[2] = 200
    存储地址:var[1] = 518a0ae0
    存储值:var[1] = 100
    存储地址:var[0] = 518a0adc
    存储值:var[0] = 10
    

    指针的比较

    指针可以用关系运算符进行比较,如 ==、< 和 >。如果 p1 和 p2 指向两个相关的变量,比如同一个数组中的不同元素,则可对 p1 和 p2 进行大小比较。
    下面的程序修改了上面的实例,只要变量指针所指向的地址小于或等于数组的最后一个元素的地址 &var[MAX - 1],则把变量指针进行递增:

    #include <stdio.h>
    
    const int MAX = 3;
    
    int main ()
    {
       int  var[] = {10, 100, 200};
       int  i, *ptr;
    
       /* 指针中第一个元素的地址 */
       ptr = var;
       i = 0;
       while ( ptr <= &var[MAX - 1] )
       {
    
          printf("Address of var[%d] = %x
    ", i, ptr );
          printf("Value of var[%d] = %d
    ", i, *ptr );
    
          /* 指向上一个位置 */
          ptr++;
          i++;
       }
       return 0;
    }
    

    当上面的代码被编译和执行时,它会产生下列结果:

    Address of var[0] = bfdbcb20
    Value of var[0] = 10
    Address of var[1] = bfdbcb24
    Value of var[1] = 100
    Address of var[2] = bfdbcb28
    Value of var[2] = 200
  • 相关阅读:
    泛微云桥e-Bridge 目录遍历,任意文件读取
    (CVE-2020-8209)XenMobile-控制台存在任意文件读取漏洞
    selenium 使用初
    将HTML文件转换为MD文件
    Python对word文档进行操作
    使用java安装jar包出错,提示不是有效的JDK java主目录
    Windows server 2012安装VM tools异常解决办法
    ifconfig 命令,改变主机名,改DNS hosts、关闭selinux firewalld netfilter 、防火墙iptables规则
    iostat iotop 查看硬盘的读写、 free 查看内存的命令 、netstat 命令查看网络、tcpdump 命令
    使用w uptime vmstat top sar nload 等命令查看系统负载
  • 原文地址:https://www.cnblogs.com/JingWenxing/p/10245487.html
Copyright © 2011-2022 走看看