当前位置:   article > 正文

区分C语言中的*(p++), *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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

a = 6, b= 5;
  • 1

理解了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;
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

a = 6, b = 6
  • 1

再来看另一个程序:

#include <stdio.h>
int main(void)
{
	int x, y;
	x = y = 1;
	x++;
	++y;
	printf("x = %d, y = %d\n", x, y);
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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

x = 2, y = 2
  • 1

通过以上三个程序可以理解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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

运行结果如下:

*p = 1, p = 000000000064FE00
*(p++) = 1, p = 000000000064FE04, *p = 3
  • 1
  • 2
  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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

运行结果:

*p = 1, p = 000000000064FE00
*(p++) = 1, p = 000000000064FE04, *p = 3
  • 1
  • 2
  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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

运行结果:

*p = 1, p = 000000000064FE00
(*p)++ = 1, p = 000000000064FE00, *p = 2
  • 1
  • 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

运行结果:

*p = 1, p = 000000000064FE00
*(++p) = 3, p = 000000000064FE04, *p = 3
  • 1
  • 2
  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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

运行结果:

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/79709
推荐阅读
相关标签
  

闽ICP备14008679号