句子文案吧网—你身边的句子专家

句子文案吧网—你身边的句子专家

c语言中*p++是*p=*p+1还是*p=为什么?

59

在C语言中,表达式 `*p++` 的含义和执行顺序如下:

一、表达式解析

运算符优先级

- `*`(解引用)和 `++`(自增)属于同一优先级操作符,且遵循 从右向左的结合性。

- 因此,`*p++` 等价于 `* (p++)`,即先计算 `p++`,再对结果进行解引用。

执行顺序

- 首先计算 `p++`,此时会先取出 `*p` 的值,然后 `p` 自增1,指向下一个内存地址。

- 然后对 `*p`(即原值)进行解引用,但解引用后的值未被使用(因为表达式整体未赋值)。

二、示例说明

```c

include

int main() {

int a = {10, 20, 30, 40, 50};

int *p = a; // p指向a

printf("初始值: *p = %d, p = %d\n", *p, (int)p); // 输出: 10 0

*p++ = 100; // 等价于 * (p++) = 100

printf("执行后: *p = %d, p = %d\n", *p, (int)p); // 输出: 100 1

return 0;

}

```

初始状态:

`*p = 10`,`p = 0`(指向数组第一个元素)。

执行 `*p++ = 100`

1. 取出 `*p` 的值 `10`,`p` 自增为 `1`(指向 `a`)。

2. 将 `100` 赋值给 `*p`(即 `a`),但表达式整体未改变 `p` 的值。

最终结果:`*p = 100`,`p = 1`。

三、与 `(*p)++` 的区别

`*p++`:先取值后自增,值不变,指针移动。

`(*p)++`:先对 `*p` 的值自增,再取值。

示例对比

```c

include

int main() {

int a = {10, 20, 30, 40, 50};

int *p = a;

printf("初始值: *p = %d, p = %d\n", *p, (int)p); // 10 0

*p++ = 100; // * (p++) = 100

printf("执行后: *p = %d, p = %d\n", *p, (int)p); // 100 1

(*p)++ = 200; // 先自增再取值

printf("再次执行后: *p = %d, p = %d\n", *p, (int)p); // 200 2

return 0;

}

```

第二次执行 `(*p)++ = 200`

1. 先将 `*p`(100)自增为 `101`。

2. 然后取值 `101` 赋给 `*p`,此时 `*p = 101`,`p = 2`。

四、总结

`*p++` 的核心是 先取值后自增,等价于 `* (p++)`,但表达式本身不改变指针位置。

若需同时获取自增后的值,需使用临时变量,例如 `int temp = *p++;`。