zoukankan      html  css  js  c++  java
  • C语言指针与自增详解

    在初学C语言,接触指针的时候,真的是比较迷惑的一件事,恰巧指针还和自增运算符碰到一起了,更是碰出了无限的可能,正所谓两仪生四象,四象生八卦啊
    为了期末考试,彻底弄明白指针和自增运算符在一起时的各种可能和现象,我们可以直接通过编写C代码来试验一下

    先上结论:

    (*p)++,先传值,后值自增1,类比a++
    *p++ == *(p++),先传值,后地址自增1
    ++*p == ++(*p),先值自增1,后传值,类比++a
    *++p == *(++p),先地址自增1,后传值
    

    代码中设计了ABCDEFG一共7种可能会出现的情况,对应着ABCDEFG这7个函数

    函数名 类型
    A (*p)++
    B *p++
    C *(p++)
    D ++*p
    E ++(*p)
    F *++p
    G *(++p)

    然后通过传入一个数组[10,20,30],让指针和自增在数组上进行造作,看看最后是什么结果,指针的值有什么变化,来推断出7种可能的结论

    源码可以运行,方便更直观的看出指针与自增在一起的运算顺序

    #include <stdio.h>
    
    void A(int array[3])
    {
        int *p = NULL;//定义一个指针
        p = array;//指向数组的首地址,以方便观察指针的移动情况,后续的函数B~G类似
        printf("-----    A    -----
    ");
        printf("> *p=%d
    
    ",*p);
        printf("printf("> (*p)++=%%d\n",(*p)++);
    ");
        printf("> (*p)++=%d
    ",(*p)++);//> (*p)++=10,先传值,后值自增1,类比a++
        printf("
    ");
        printf("printf("> *p=%%d\n",*p);
    ");
        printf("> *p=%d
    ",*p);//> *p=11
        printf("
    ");
    }
    
    void B(int array[3])
    {
        int *p = NULL;
        p = array;
        printf("-----    B    -----
    ");
        printf("> *p=%d
    
    ",*p);
        printf("printf("> *p++=%%d\n",*p++);
    ");
        printf("> *p++=%d
    ",*p++);//> *p++=10,先传值,后地址自增1
        printf("
    ");
        printf("*printf("> *p=%%d\n",*p);
    ");
        printf("> *p=%d
    ",*p);//> *p=20
        printf("
    ");
    }
    
    void C(int array[3])
    {
        int *p = NULL;
        p = array;
        printf("-----    C    -----
    ");
        printf("> *p=%d
    
    ",*p);
        printf("printf("> *(p++)=%%d\n",*(p++));
    ");
        printf("> *(p++)=%d
    ",*(p++));//> *(p++)=10,先传值,后地址自增1
        printf("
    ");
        printf("printf("> *p=%%d\n",*p);
    ");
        printf("> *p=%d
    ",*p);//> *p=20
        printf("
    ");
    }
    
    void D(int array[3])
    {
        int *p = NULL;
        p = array;
        printf("-----    D    -----
    ");
        printf("> *p=%d
    
    ",*p);
        printf("printf("> ++*p=%%d\n",++*p);
    ");
        printf("> ++*p=%d
    ",++*p);//> ++*p=11,先值自增1,后传值
        printf("
    ");
        printf("printf("> *p=%%d\n",*p);
    ");
        printf("> *p=%d
    ",*p);//> *p=11
        printf("
    ");
    }
    
    void E(int array[3])
    {
        int *p = NULL;
        p = array;
        printf("-----    E    -----
    ");
        printf("> *p=%d
    
    ",*p);
        printf("printf("> ++(*p)=%%d\n",++(*p));
    ");
        printf("> ++(*p)=%d
    ",++(*p));//> ++(*p)=11,先值自增1,后传值,类比++a
        printf("
    ");
        printf("printf("> *p=%%d\n",*p);
    ");
        printf("> *p=%d
    ",*p);//> *p=11
        printf("
    ");
    }
    
    void F(int array[3])
    {
        int *p = NULL;
        p = array;
        printf("-----    F    -----
    ");
        printf("> *p=%d
    
    ",*p);
        printf("printf("> *++p=%%d\n",*++p);
    ");
        printf("> *++p=%d
    ",*++p);//> *++p=20,先地址自增1,后传值
        printf("
    ");
        printf("printf("> *p=%%d\n",*p);
    ");
        printf("> *p=%d
    ",*p);//> *p=20
        printf("
    ");
    }
    
    void G(int array[3])
    {
        int *p = NULL;
        p = array;
        printf("-----    G    -----
    ");
        printf("> *p=%d
    
    ",*p);
        printf("printf("> *(++p)=%%d\n",*(++p));
    ");
        printf("> *(++p)=%d
    ",*(++p));//> *(++p)=20,先地址自增1,后传值
        printf("
    ");
        printf("printf("> *p=%%d\n",*p);
    ");
        printf("> *p=%d
    ",*p);//> *p=20
        printf("
    ");
    }
    
    int main(void)
    {
        int a[3]={10,20,30},b[3]={10,20,30},c[3]={10,20,30},d[3]={10,20,30},e[3]={10,20,30},f[3]={10,20,30},g[3]={10,20,30};
        printf("array[3]={10,20,30}
    p=array
    
    ");
        A(a); // (*p)++  先传值,后值自增1,类比a++
        B(b); // *p++ == *(p++)  先传值,后地址自增1
        C(c); // *(p++) == *p++  先传值,后地址自增1
        D(d); // ++*p == ++(*p)  先值自增1,后传值
        E(e); // ++(*p) == ++*p  先值自增1,后传值,类比++a
        F(f); // *++p == *(++p)  先地址自增1,后传值
        G(g); // *(++p) == *++p  先地址自增1,后传值
        printf("
    >> A ---> (*p)++,先传值,后值自增1,类比a++
    >> B==C ---> *p++ == *(p++),先传值,后地址自增1
    >> D==E ---> ++*p == ++(*p),先值自增1,后传值,类比++a
    >> F==G ---> *++p == *(++p),先地址自增1,后传值
    ");
        return 0;
    }
    

    执行结果

    array[3]={10,20,30}
    p=array
    
    -----    A    -----
    > *p=10
    
    printf("> (*p)++=%d
    ",(*p)++);
    > (*p)++=10
    
    printf("> *p=%d
    ",*p);
    > *p=11
    
    -----    B    -----
    > *p=10
    
    printf("> *p++=%d
    ",*p++);
    > *p++=10
    
    *printf("> *p=%d
    ",*p);
    > *p=20
    
    -----    C    -----
    > *p=10
    
    printf("> *(p++)=%d
    ",*(p++));
    > *(p++)=10
    
    printf("> *p=%d
    ",*p);
    > *p=20
    
    -----    D    -----
    > *p=10
    
    printf("> ++*p=%d
    ",++*p);
    > ++*p=11
    
    printf("> *p=%d
    ",*p);
    > *p=11
    
    -----    E    -----
    > *p=10
    
    printf("> ++(*p)=%d
    ",++(*p));
    > ++(*p)=11
    
    printf("> *p=%d
    ",*p);
    > *p=11
    
    -----    F    -----
    > *p=10
    
    printf("> *++p=%d
    ",*++p);
    > *++p=20
    
    printf("> *p=%d
    ",*p);
    > *p=20
    
    -----    G    -----
    > *p=10
    
    printf("> *(++p)=%d
    ",*(++p));
    > *(++p)=20
    
    printf("> *p=%d
    ",*p);
    > *p=20
    
    
    >> A ---> (*p)++,先传值,后值自增1,类比a++
    >> B==C ---> *p++ == *(p++),先传值,后地址自增1
    >> D==E ---> ++*p == ++(*p),先值自增1,后传值,类比++a
    >> F==G ---> *++p == *(++p),先地址自增1,后传值
    
  • 相关阅读:
    Centos 7 zabbix 实战应用
    Centos7 Zabbix添加主机、图形、触发器
    Centos7 Zabbix监控部署
    Centos7 Ntp 时间服务器
    Linux 150命令之查看文件及内容处理命令 cat tac less head tail cut
    Kickstart 安装centos7
    Centos7与Centos6的区别
    Linux 150命令之 文件和目录操作命令 chattr lsattr find
    Linux 发展史与vm安装linux centos 6.9
    Linux介绍
  • 原文地址:https://www.cnblogs.com/biem/p/13510476.html
Copyright © 2011-2022 走看看