在解除引用的指针上增加增量?

为了理解C语言中指针的行为,我对以下内容(以下示例代码)感到有些惊讶:


#include <stdio.h>


void add_one_v1(int *our_var_ptr)

{

    *our_var_ptr = *our_var_ptr +1;

}


void add_one_v2(int *our_var_ptr)

{

    *our_var_ptr++;

}


int main()

{

    int testvar;


    testvar = 63;

    add_one_v1(&(testvar));         /* Try first version of the function */

    printf("%d\n", testvar);        /* Prints out 64                     */

    printf("@ %p\n\n", &(testvar));


    testvar = 63;

    add_one_v2(&(testvar));         /* Try first version of the function */

    printf("%d\n", testvar);        /* Prints 63 ?                       */

    printf("@ %p\n", &(testvar));   /* Address remains identical         */

}

输出:


64

@ 0xbf84c6b0


63

@ 0xbf84c6b0

*our_var_ptr++由于第二个函数(add_one_v2)中的语句显然与之不同,因此该语句究竟能做什么*our_var_ptr = *our_var_ptr +1?


拉丁的传说
浏览 402回答 3
3回答

眼眸繁星

这是使C和C ++变得如此有趣的那些小陷阱之一。如果您想弯曲您的大脑,请找出这一点:while (*dst++ = *src++) ;这是一个字符串副本。指针不断递增,直到复制了值为零的字符。一旦知道了这种技巧的作用,您将永远不会忘记++如何再次处理指针。PS您始终可以用括号覆盖运算符顺序。以下将增加所指向的值,而不是指针本身:(*our_var_ptr)++;

慕容3067478

好,*our_var_ptr++;它是这样的:取消引用首先发生,给您指示的存储位置our_var_ptr(包含63)。然后对表达式求值,结果63仍然是63。结果被丢弃(您对此不做任何事情)。our_var_ptr然后在评估后增加。它正在改变指针指向的位置,而不是指针指向的位置。它实际上与执行此操作相同:*our_var_ptr;our_var_ptr = our_var_ptr + 1;&nbsp;说得通?马克·兰瑟姆(Mark Ransom)的答案很好地说明了这一点,只是他实际上使用了结果。
打开App,查看更多内容
随时随地看视频慕课网APP