指针算术:* p ++和(* p)++等

时间:2017-06-17 18:14:43

标签: c++ c pointers

#include<stdio.h>
int main()
{
    int k=0;
    int* p=&k;
    printf("%d %d\n", p, k);
    *p++;
    printf("%d %d\n", p, k);
    (*p)++;
    printf("%d %d\n", p, k);
}

上面的代码在Dev C ++中打印出来:

6422184 0

6422188 0

6412189 0 // p增加1 - > ???

上面的代码在ideone.com中打印出来:

368737692 0

368737696 0

368737696 0

#include<stdio.h>
int main()
{
    int k=0;
    int* p=&k;
    int* t=p; // the only difference
    printf("%d %d\n", p, k);
    *p++;
    printf("%d %d\n", p, k);
    (*p)++;
    printf("%d %d\n", p, k);
}

上面的代码在Dev C ++中打印出来:

6422180 0

6422184 0

6412184 0

我认为(* p)++会增加变量p指向的值。所以我相信第一个代码应该在Dev C ++中打印出来:

6422184 0

6422188 0

6412188 0

int * t的存在是否会影响(* p)++的工作方式?或者这只是一种未定义的行为?我对指针很弱,请帮忙!

2 个答案:

答案 0 :(得分:1)

你好,我终于理解了你的问题,我想我有一个解释。

    #include<stdio.h>
        int main()
        {
            int k=0;
            int* p=&k; // p will point to k ( p -> k)

            printf("%d %d\n", p, k); // you will print p(k address) and k value

            *p++; // you increment p value so p NO LONGER points to k !!! 

            // p now holds another memory address (it is not related to k anymore)

            printf("%d %d\n", p, k); // you print the new p value and k value

            (*p)++; // here happens UNDEFINED BEHAVIOR
            //you increment a value and you  know nothing about it 
            // is it an int ? is it a char ? is it p adress itself ? ... ???

            printf("%d %d\n", p, k); 
        }

我已经在更多的编译器上尝试了你的代码,我得到了不同的结果(甚至在Ubuntu下的gcc)。 希望这有帮助,谢谢。

答案 1 :(得分:0)

首先使用p指向k,这是一个本地标量变量,它是一个单独的int。然后递增p。由于k不是数组,因此递增p会导致指针无效(不指向任何内容),然后取消引用它会导致未定义的行为。

未定义的行为意味着可能会发生 ANYTHING 。任何东西。虽然您可能认为通过递增指针读取只会给出k之后在内存中发生的任何事情,但是没有任何保证会发生。编译器可以自由地生成实际更改不相关事物值(例如p的值)的代码,这些代码似乎是一个无法改变任何值的简单读取。

在你的情况下,你实际上修改(增加)指向无效指针的值,因此它更可能导致奇怪和不可预测的结果 - 比如重置p的值