对*p++与*++p;(*p)++ 与 ++(*p)的理解

本文详细解析了C/C++中指针与递增(++)及递减(--)运算符的结合方式及其行为差异,通过具体示例说明了*p++、*++p、(*p)++及++(*p)四种形式的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:https://blog.youkuaiyun.com/baidu_37973494/article/details/82761455 

 

*p++:等同于:*p;  p += 1;
解析:由于*和++的运算优先级一样,且是右结合。故*p++相当于*(p++),p先与++结合,然后p++整体再与*结合。前面陈述是一种最常见的错误,很多初学者也是这么理解的。但是,因为++后置的时候,本身含义就是先运算后增加1(运算指的是p++作为一个整体与前面的*进行运算;增加1指的是p+1),所以实际上*p++符号整体对外表现的值是*p的值,运算完成后p再加1.

【注意】是运算后p再加1,而不是p所指向的变量*p再加1

*++p:等同于 p += 1;    *p;
解析:由于++在p的前面,++前置的含义是,先加1,得到一个新的p(它的值是原来p的值加1)。然后这个新的p再与前面的*结合.

【总结】无论是*p++还是*++p,都是指针p += 1,即p的值+1,而不是p所指向的变量*p的值+1。

++前置与++后置,只是决定了到底是先p += 1,还是先*p。++前置表示先p += 1,再*p。++后置表示先*p,在p += 1;

--前置与--后置的的分析方法++前置与++后置的一样。

【补充】  (*p)++  与 ++(*p)

 (*p)++,使用()强制将*与p结合,只能先计算*p,然后对*p整体的值++。

 ++(*p),先*p取值,再前置++,[该值+1后]作为整个表达式的值。

【四种形式的助记】

1、*永远在最前面,++可以站在p的前面和后面

2、(*p)作为一整体,++可以站在(*p)的前面和后面
 

举例:

int a[5]={1,2,3,4,5};
int *p = a;

 

*p++ 先取指针p指向的值(数组第一个元素1),再将指针p自增1;

cout << *p++; // 结果为 1

cout <<(*p++); // 1

 

(*p)++ 先去指针p指向的值(数组第一个元素1),再将该值自增1(数组第一个元素变为2

cout << (*p)++; // 1

cout <<((*p)++) //2

 

*++p 先将指针p自增1(此时指向数组第二个元素),* 操作再取出该值

cout << *++p; // 2

cout <<(*++p) //2

 

++*p 先取指针p指向的值(数组第一个元素1),再将该值自增1(数组第一个元素变为2)

cout <<++*p; // 2

cout <<(++*p) //2


注意,上面的每条cout输出,要单独输出才能得到后面的结果。

### `*p++` `*(++p)` 的区别 在C语言中,`*p++` `*(++p)` 是两个涉及指针操作的表达式,它们的行为执行顺序存在显著差异,主要体现在操作对象执行时机上。 #### `*p++` 的行为 表达式 `*p++` 实际上等价于 `*(p++)`。它的执行顺序是:首先对指针 `p` 进行解引用操作,获取当前指向的值;然后将指针 `p` 本身递增,指向下一个元素。由于 `++` 操作符的优先级低于 `*`,因此 `p++` 会先执行解引用,再递增指针。 例如,假设 `p` 指向数组 `arr[]` 的第一个元素,执行 `*p++` 会返回 `arr[0]` 的值,并将 `p` 移动到 `arr[1]` 的位置 [^2]。 ```c int arr[] = {10, 20, 30}; int *p = arr; int val = *p++; // 返回 arr[0],p 指向 arr[1] ``` #### `*(++p)` 的行为 表达式 `*(++p)` 等价于 `*++p`。它的执行顺序是:首先将指针 `p` 递增,使其指向下一个元素;然后对新的地址进行解引用操作,获取该地址所存储的值。由于 `++` 在前,因此递增操作会在解引用之前完成 [^2]。 例如,假设 `p` 指向数组 `arr[]` 的第一个元素,执行 `*(++p)` 会先将 `p` 移动到 `arr[1]`,然后返回 `arr[1]` 的值。 ```c int arr[] = {10, 20, 30}; int *p = arr; int val = *(++p); // p 指向 arr[1],返回 arr[1] ``` #### 行为对比总结 | 表达式 | 递增顺序 | 操作对象 | 结果描述 | |--------------|----------|------------|------------------------------------------| | `*p++` | 后置递增 | 指针 `p` | 先解引用,后递增指针,返回当前值 | | `*(++p)` | 前置递增 | 指针 `p` | 先递增指针,后解引用,返回新地址的值 | #### 示例代码 以下代码演示了 `*p++` `*(++p)` 的执行顺序结果: ```c #include <stdio.h> int main() { int arr[] = {10, 20, 30}; int *p = arr; printf("初始值: %d\n", *p); // 输出 10 int val1 = *p++; // 先取值后递增 printf("*p++: %d\n", val1); // 输出 10 printf("p 现在指向: %d\n", *p); // 输出 20 int val2 = *(++p); // 先递增后取值 printf("*(++p): %d\n", val2); // 输出 30 printf("最终 p 指向: %d\n", *p); // 输出 30 return 0; } ``` ### 相关问题 1. C语言中 `*p++` `(*p)++` 的区别是什么? 2. 如何理解 `*++p` `++(*p)` 在指针操作中的行为? 3. 在C语言中,指针运算值递增的优先级如何影响表达式的执行顺序?
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值