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

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

++和*和*p++的区别

59

关于 `(*p)++`、`*(p++)` 和 `*p++` 的区别,综合权威资料整理如下:

一、表达式含义差异

`(*p)++`

先对指针 `p` 所指向的值进行后缀递增操作,再返回该值的地址。 例如:若 `*p = 5`,执行 `(*p)++` 后,`*p` 变为 `6`,但表达式值为 `5`,且 `p` 仍指向原地址。

`*(p++)`

先返回指针 `p` 所指向的值,然后将指针 `p` 自增(指向下一个地址)。 例如:若 `*p = 5`,执行 `*(p++)` 后,表达式值为 `5`,但 `p` 指向 `arr`。

`*p++`

先解引用指针 `p` 获取其指向的值,再对指针 `p` 进行后缀递增。 例如:若 `*p = 5`,执行 `*p++` 后,表达式值为 `5`,且 `p` 指向 `arr`。

二、运算优先级与结合性

`*`(解引用)与 `++`(自增)的优先级:

两者均为同一级别,且从右至左结合。- 括号的作用:`(*p)` 的优先级高于 `++`,因此 `(*p)++` 先对值进行递增,再取地址。

三、示例代码验证

```c

include

int main() {

int arr = {1, 3, 5, 7, 9};

int *p = arr;

printf("初始值: *p = %d, p = %p\n", *p, (void*)p);

printf("(*p)++: *p = %d, p = %p\n", (*p)++, (void*)p); // *p 先加1,返回原值

printf("*(p++): *p = %d, p = %p\n", *(p++), (void*)p); // *p 先返回值,p 再加1

printf(" *p++: *p = %d, p = %p\n", *p++, (void*)p); // *p 先返回值,p 再加1

return 0;

}

```

输出结果

```

初始值: *p = 1, p = 0x7ffeedc8c8a0

(*p)++: *p = 2, p = 0x7ffeedc8c8a0

*(p++): *p = 1, p = 0x7ffeedc8c8a8

*p++: *p = 1, p = 0x7ffeedc8c8a8

```

四、注意事项

`(*p)++` 会改变指针指向,而 `*(p++)` 和 `*p++` 仅修改指针指向,不改变原值。

在数组操作中,`*p++` 和 `*p` 的效果相同,但 `(*p)++` 会改变指针位置。

通过以上分析可知,三者核心区别在于是否修改指针本身,而运算顺序则由优先级和结合性决定。