在初学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
void A(int array[3])
{
int *p = NULL;
p = array;
printf("----- A -----\n");
printf("> *p=%d\n\n",*p);
printf("printf(\"> (*p)++=%%d\\n\",(*p)++);\n");
printf("> (*p)++=%d\n",(*p)++);//> (*p)++=10,先传值,后值自增1,类比a++
printf("\n");
printf("printf(\"> *p=%%d\\n\",*p);\n");
printf("> *p=%d\n",*p);//> *p=11
printf("\n");
}
void B(int array[3])
{
int *p = NULL;
p = array;
printf("----- B -----\n");
printf("> *p=%d\n\n",*p);
printf("printf(\"> *p++=%%d\\n\",*p++);\n");
printf("> *p++=%d\n",*p++);//> *p++=10,先传值,后地址自增1
printf("\n");
printf("*printf(\"> *p=%%d\\n\",*p);\n");
printf("> *p=%d\n",*p);//> *p=20
printf("\n");
}
void C(int array[3])
{
int *p = NULL;
p = array;
printf("----- C -----\n");
printf("> *p=%d\n\n",*p);
printf("printf(\"> *(p++)=%%d\\n\",*(p++));\n");
printf("> *(p++)=%d\n",*(p++));//> *(p++)=10,先传值,后地址自增1
printf("\n");
printf("printf(\"> *p=%%d\\n\",*p);\n");
printf("> *p=%d\n",*p);//> *p=20
printf("\n");
}
void D(int array[3])
{
int *p = NULL;
p = array;
printf("----- D -----\n");
printf("> *p=%d\n\n",*p);
printf("printf(\"> ++*p=%%d\\n\",++*p);\n");
printf("> ++*p=%d\n",++*p);//> ++*p=11,先值自增1,后传值
printf("\n");
printf("printf(\"> *p=%%d\\n\",*p);\n");
printf("> *p=%d\n",*p);//> *p=11
printf("\n");
}
void E(int array[3])
{
int *p = NULL;
p = array;
printf("----- E -----\n");
printf("> *p=%d\n\n",*p);
printf("printf(\"> ++(*p)=%%d\\n\",++(*p));\n");
printf("> ++(*p)=%d\n",++(*p));//> ++(*p)=11,先值自增1,后传值,类比++a
printf("\n");
printf("printf(\"> *p=%%d\\n\",*p);\n");
printf("> *p=%d\n",*p);//> *p=11
printf("\n");
}
void F(int array[3])
{
int *p = NULL;
p = array;
printf("----- F -----\n");
printf("> *p=%d\n\n",*p);
printf("printf(\"> *++p=%%d\\n\",*++p);\n");
printf("> *++p=%d\n",*++p);//> *++p=20,先地址自增1,后传值
printf("\n");
printf("printf(\"> *p=%%d\\n\",*p);\n");
printf("> *p=%d\n",*p);//> *p=20
printf("\n");
}
void G(int array[3])
{
int *p = NULL;
p = array;
printf("----- G -----\n");
printf("> *p=%d\n\n",*p);
printf("printf(\"> *(++p)=%%d\\n\",*(++p));\n");
printf("> *(++p)=%d\n",*(++p));//> *(++p)=20,先地址自增1,后传值
printf("\n");
printf("printf(\"> *p=%%d\\n\",*p);\n");
printf("> *p=%d\n",*p);//> *p=20
printf("\n");
}
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}\np=array\n\n");
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("\n>> A ---> (*p)++,先传值,后值自增1,类比a++\n>> B==C ---> *p++ == *(p++),先传值,后地址自增1\n>> D==E ---> ++*p == ++(*p),先值自增1,后传值,类比++a\n>> F==G ---> *++p == *(++p),先地址自增1,后传值\n");
return 0;
}
执行结果
array[3]={10,20,30}
p=array
----- A -----
> *p=10
printf("> (*p)++=%d\n",(*p)++);
> (*p)++=10
printf("> *p=%d\n",*p);
> *p=11
----- B -----
> *p=10
printf("> *p++=%d\n",*p++);
> *p++=10
*printf("> *p=%d\n",*p);
> *p=20
----- C -----
> *p=10
printf("> *(p++)=%d\n",*(p++));
> *(p++)=10
printf("> *p=%d\n",*p);
> *p=20
----- D -----
> *p=10
printf("> ++*p=%d\n",++*p);
> ++*p=11
printf("> *p=%d\n",*p);
> *p=11
----- E -----
> *p=10
printf("> ++(*p)=%d\n",++(*p));
> ++(*p)=11
printf("> *p=%d\n",*p);
> *p=11
----- F -----
> *p=10
printf("> *++p=%d\n",*++p);
> *++p=20
printf("> *p=%d\n",*p);
> *p=20
----- G -----
> *p=10
printf("> *(++p)=%d\n",*(++p));
> *(++p)=20
printf("> *p=%d\n",*p);
> *p=20
>> A ---> (*p)++,先传值,后值自增1,类比a++
>> B==C ---> *p++ == *(p++),先传值,后地址自增1
>> D==E ---> ++*p == ++(*p),先值自增1,后传值,类比++a
>> F==G ---> *++p == *(++p),先地址自增1,后传值