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,后传值
    
  • 相关阅读:
    组合模式
    迭代器模式
    模板方法模式
    外观模式
    适配器模式
    运行mysql时,提示Table ‘performance_schema.session_variables’ doesn’t exist
    idea maven 打包 引用本地jar
    centos7 安装redis
    centos7 防火墙
    linux 常用命令
  • 原文地址:https://www.cnblogs.com/biem/p/13510476.html
Copyright © 2011-2022 走看看