c 语言 指针 自增,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

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,后传值

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值