admin 管理员组

文章数量: 887053

区分C语言中的*(p++), *p++, (*p)++, *(++p), *++p

p是一个指针

1.要清楚运算符之间的优先级与结合性:

()运算符,.运算符,++(后缀)运算符的优先级最高,结合方向均为自左向右。
++(前缀)运算符,*运算符的优先级次之,结合方向均为自右向左。

2.要清楚i++ 与 ++i的区别:

分析下面这个程序

include <stdio.h>
int main(void)
{int a = 5, b;b = a++; /*等价于这两条语句b = a; a = a + 1;*/printf("a = %d, b = %d\n", a, b);return 0;
}

猜一猜运行结果会是多少?
没错,运行结果如下:

a = 6, b= 5;

理解了i++后我们再来接着看另一个程序

include <stdio.h>
int main(void)
{    int a = 5, b; b = ++a; /*等价于这两条语句a = a + 1; b b = a;*/    printf("a = %d, b = %d\n", a, b);             return 0;}

这个程序的运行结果与上一个会是一样吗?
正确结果如下:

a = 6, b = 6

再来看另一个程序:

#include <stdio.h>
int main(void)
{int x, y;x = y = 1;x++;++y;printf("x = %d, y = %d\n", x, y);return 0;
}

x与y的结果会相等吗?运行结果如下:

x = 2, y = 2

通过以上三个程序可以理解i++与++i:
1、++作为前缀运算符与作为后缀运算符相比,对变量(即运算对象)而言,运算的结果都是一样的,当增1表达式本身的值却是不同的。
2、i++:先使用变量i的当前值作为i++表达式的值,然后再对i进行加1操作。
3、++i:先对变量i进行加1操作,然后将i的值作为表达式i++的值。
4、++(后缀)的优先级高于++(前缀)的优先级。

3.进入正题

当p表示一个指针变量指向数组a[5] = {1,3,5,7,9}的首地址时

  1. 理解*(p++)
    此时先使用变量p的值作为(p++)的结果,然后将 *p 作为表达式 *(p++)的结果,然后再对p进行加1操作。
    示例代码:
#include <stdio.h>int main(void)
{int a[5] = {1,3,5,7,9};int *p = a;printf("*p = %d, p = %p\n", *p, p);printf("*(p++) = %d, p = %p, ", *(p++), p);printf("*p = %d\n", *p);return 0;
}

运行结果如下:

*p = 1, p = 000000000064FE00
*(p++) = 1, p = 000000000064FE04, *p = 3
  1. 理解*p++:
    由于++(后缀)的优先级高于 * 的优先级 ,所以表达式 *p++等价于 *(p++)。
    示例代码:
#include <stdio.h>int main(void)
{int a[5] = {1,3,5,7,9};int *p = a;printf("*p = %d, p = %p\n", *p, p);printf("*p++ = %d, p = %p, ", *p++, p);printf("*p = %d\n", *p);return 0;
}

运行结果:

*p = 1, p = 000000000064FE00
*(p++) = 1, p = 000000000064FE04, *p = 3
  1. 理解(* p)++:
    此时先使用*p的值作为此表达式的值,然后执行 *p加1操作。
    示例代码:
#include <stdio.h>int main(void)
{int a[5] = {1,3,5,7,9};int *p = a;printf("*p = %d, p = %p\n", *p, p);printf("(*p)++ = %d, p = %p, ", (*p)++, p);printf("*p = %d\n", *p);return 0;
}

运行结果:

*p = 1, p = 000000000064FE00
(*p)++ = 1, p = 000000000064FE00, *p = 2
  1. 理解*(++p):
    首先先将p进行加1操作,然后将p作为++p的结果,再进行*p操作。
    示例代码:
#include <stdio.h>int main(void)
{int a[5] = {1,3,5,7,9};int *p = a;printf("*p = %d, p = %p\n", *p, p);printf("*(++p) = %d, p = %p, ", *(++p), p);printf("*p = %d\n", *p);return 0;
}

运行结果:

*p = 1, p = 000000000064FE00
*(++p) = 3, p = 000000000064FE04, *p = 3
  1. 理解*++p:
    因为 * 与++(前缀)优先级相同,且自右向左执行,所以表达式*++p等价于*(++p)。
    示例代码如下:
#include <stdio.h>int main(void)
{int a[5] = {1,3,5,7,9};int *p = a;printf("*p = %d, p = %p\n", *p, p);printf("*++p = %d, p = %p, ", *++p, p);printf("*p = %d\n", *p);return 0;
}

运行结果:

*p = 1, p = 000000000064FE00
*++p = 3, p = 000000000064FE04, *p = 3

小白一枚,如有错误,还请纠正。

本文标签: 区分C语言中的*(p) *p (*p) *(p)