当前位置:首页 C++ > 正文

c++中*p++和*(p++)的区别

作者:野牛程序员:2023-07-21 12:53:26 C++阅读 3139

在C++中,*p++*(p++)有不同的含义和行为。我们逐个解释每个表达式:

  1. *p++: 这个表达式涉及指针和后置递增运算符。以下是它的逐步执行过程:

    举例来说,假设 p 是指向整数的指针,它指向内存位置 0x1000,而该位置的值为 42。那么,*p++ 表达式将首先访问内存位置 0x1000 处的值(也就是 42),然后将 p 的值增加1,指向内存位置 0x1001。

    • *p:这将对指针 p 进行解引用,也就是访问 p 指向的值。

    • p++:这是后置递增运算符,它会将指针 p 的值加1,但是在整个表达式求值后才会执行递增操作。也就是说,首先使用 p 的值进行解引用,然后再将 p 的值增加1。

  2. *(p++): 这个表达式也涉及指针和后置递增运算符,但是它们的结合方式有所不同。以下是它的逐步执行过程:

    同样以前面的假设为例,p 是指向整数的指针,它指向内存位置 0x1000,而该位置的值为 42。使用 *(p++) 表达式,首先将 p 的值增加1,指向内存位置 0x1001,然后对该位置进行解引用,即访问内存位置 0x1001 处的值(取决于该位置的内容)。

    • p++:这是后置递增运算符,与上面相同,会将指针 p 的值加1,但是在整个表达式求值后才会执行递增操作。

    • *(p++):在这个表达式中,先执行 p++,然后再对递增后的 p 进行解引用,也就是访问递增后的位置的值。

总结:*p++ 先解引用,后递增指针;*(p++) 先递增指针,后解引用。这种细微的差异可能会影响程序的行为,因此在使用时需要谨慎考虑。

下面用具体的示例来说明*p++*(p++)的区别。

#include <iostream>

int main() {
    int arr[] = {10, 20, 30, 40};
    int* p = arr; // p指向数组的第一个元素

    // 示例 1: *p++
    std::cout << "示例 1: *p++" << std::endl;
    std::cout << "*p = " << *p << std::endl; // 输出 *p = 10
    std::cout << "*(p++) = " << *(p++) << std::endl; // 输出 *(p++) = 10
    std::cout << "*p = " << *p << std::endl; // 输出 *p = 20,p指向数组的第二个元素

    // 示例 2: *(p++)
    p = arr; // 重新将p指向数组的第一个元素

    std::cout << "\\n示例 2: *(p++)" << std::endl;
    std::cout << "*p = " << *p << std::endl; // 输出 *p = 10
    std::cout << "*(p++) = " << *(p++) << std::endl; // 输出 *(p++) = 10,p指向数组的第二个元素
    std::cout << "*p = " << *p << std::endl; // 输出 *p = 20

    return 0;
}

输出结果为:

示例 1: *p++
*p = 10
*(p++) = 10
*p = 20

示例 2: *(p++)
*p = 10
*(p++) = 10
*p = 20

在示例1中,*p++首先对p进行解引用,获取指针指向的值(数组的第一个元素10),然后再对p执行后置递增操作,使得p指向数组的第二个元素20。

在示例2中,*(p++)先对p执行后置递增操作,使得p指向数组的第二个元素20,然后再对递增后的p进行解引用,获取该位置的值(数组的第二个元素20)。

这样,通过示例,我们可以清楚地看到*p++*(p++)在执行过程中的差异。


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击