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,后传值
原文地址:https://www.cnblogs.com/biem/p/13510476.html