• C指针的运算


    • 指针的运算在数组中才有意义

    int *p; p++,一定是在一片连续的区域才有意义,当然越界也会带来诸多问题。

    void main()
    {
        int num = 10;
        int *p = #//这根本无界可言
        p++;
        printf("%d
    ",*p);
        getchar();
    }

    输出结果:

    #include<stdio.h>
    #include<stdlib.h>
    #include<Windows.h>
    void main()
    {
        int num[10] = {1,2,3,4,5,6,7,8,9,10};
        int *a = num;
        for (int *p =num+9; p>=a;p--)
        {
            printf("%d
    ", *p);
        }
        getchar();
    }
    #include<stdio.h>
    #include<stdlib.h>
    #include<Windows.h>
    void main()
    {
        int num[10] = {1,2,3,4,5,6,7,8,9,10};
        int *a = num;
        a = a + 3;//后移3个元素,到元素4
        printf("%d
    ",*a);//4
        a = a - 2;//从元素4前移2个单位到元素2
        printf("%d
    ", *a);//2
        getchar();
    }

    输出结果:

    •  指针可以比大小,所谓大的地址上比较靠后,小的地址比较靠前,意义仅在于此,当然还得是在一个数组里的两个指针比较才有意义
    • *p++=====》*(p++)
    #include<stdio.h>
    #include<stdlib.h>
    #include<Windows.h>
    void main()
    {
        int num[10] = {1,2,3,4,5,6,7,8,9,10};
        int*p = num;
        for (int *p = num + 9; p >= num;p--)
        {
            printf("值是----%d,地址是----%p
    ",*p,p);
        }
        printf("%d,地址是:%p
    ", *p++,p);//运算过程,*(p++)  1.p++,返回p,2.运算*p 3.p++
        printf("值是%d,地址是%p
    ", *p, p);
        getchar();
    }

    输出结果:

    #include<stdio.h>
    #include<stdlib.h>
    #include<Windows.h>
    void main()
    {
        int num[10] = {1,2,3,4,5,6,7,8,9,10};
        int*p = num;
        for (int *p = num + 9; p >= num;p--)
        {
            printf("值是----%d,地址是----%p
    ",*p,p);
        }
        printf("%d,地址是:%p
    ", *++p,p);//运算过程,*(++p )  1.++p,从数组首元素地址推进到第一个元素的地址a[1],2.返回地址处于a[1]1的值
        printf("值是%d,地址是%p
    ", *p, p);
        getchar();
    }

    输出结果:

     

    #include<stdio.h>
    #include<stdlib.h>
    #include<Windows.h>
    void main()
    {
        int num[10] = {1,2,3,4,5,6,7,8,9,10};
        int*p = num;
        for (int *p = num + 9; p >= num;p--)
        {
            printf("值是----%d,地址是----%p
    ",*p,p);
        }
        ++p;
        printf("%d,地址是:%p
    ", *p,p);//运算过程,*(p++)  1.p++,返回p,2.运算*p 3.p++
        getchar();
    }

    输出结果:

    •  指针相减:意义-----两个元素相隔的距离----当然要求是相同类型的元素地址;指针之差和指向的数值也没有任何意义
    #include<stdio.h>
    #include<stdlib.h>
    #include<Windows.h>
    void main()
    {
        int a = 3, b = 4;
        int *p = &a;
        int *q = &b;
        printf("a,b两元素相隔距离%d
    ", q-p);
        getchar();
    }

    输出结果:

     我们观测到两个变量的地址,windows操作系统下,打开计算器,选择程序员型工作模式,选择十六进制模式,用EE0减去ED4,得出结果后转十进制算出了12

    当然相隔3个单位,每个整型长度为4,那么3个单位就相差12个字节

     在数组中,指针相减可以有助于帮我们定位元素在数组中所处位置

    #include<stdio.h>
    #include<stdlib.h>
    #include<Windows.h>
    void main()
    {
        int a[10] = {1,2,3,4,5,6,7,8,9,10};
        int *p1 = &a[2];
        int *p2 = &a[9];
        int *p3 = p1 + 4;
        printf("p3的地址%p,代表元素%d
    ",p3,*p3);
        printf("p1和p2地址相差%d单位
    ", p2-p1);
        getchar();
    }

    输出结果:

  • 相关阅读:
    馨梦ASP服务器|馨梦ASP服务器V2014.7官方版下载
    类和对象的关系
    eclipse找不到或无法加载主类
    注释的最佳位置
    java软件开发
    使用MySqlHelper类查询并显示数据
    使用System.Web.HttpUtility.UrlEncode提示HttpUtility不是Web成员
    VB.net打印指定文件-(目前是打印文件名)
    馨梦ASP服务器|馨梦ASP服务器V2017.7官方版下载
    VB.net将中文转为URLencode问题
  • 原文地址:https://www.cnblogs.com/saintdingspage/p/11950603.html
Copyright © 2020-2023  润新知