Постинкремент по разыменованному указателю? - PullRequest
50 голосов
/ 13 мая 2009

Пытаясь понять поведение указателей в 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?

Ответы [ 12 ]

0 голосов
/ 02 ноября 2017

Из K & R, стр. 105: «Значение * t ++ - это символ, на который указывал t до увеличения t».

0 голосов
/ 17 августа 2012

Поскольку указатель передается по значению, увеличивается только локальная копия. Если вы действительно хотите увеличить указатель, вы должны передать его по ссылке следующим образом:

void inc_value_and_ptr(int **ptr)
{
   (**ptr)++;
   (*ptr)++;
}
...