Какая разница между конструкциями *ptr + 1; и (*ptr)++ в Си?

На этих примерах можете объяснить:

#include <stdio.h>

int main(void)
{
    int g = 476789;
    char *ptr = (char *)&g;

    int r = (*ptr)++;
    
    printf("%d\n", r); 
    return 0;
}    
#include <stdio.h>

int main(void)
{
    int g = 476789;
    char *ptr = (char *)&g;

    int r = *ptr + 1;
    
    printf("%d\n", r); 
    return 0;
}

Почему в первом случае значение переменной g меняется, а во втором случае нет?

Пусть в ячейке где хранится переменная g младший байт будет = 107. Далее во примере сперва разыменовываться ptr, т.е получается значение 107 и к нему прибавляется + 1 в итоге переменная r равна = 108, а получается значение переменной g не поменялось т.к младший байт не поменялся. А в первом случае я как-то путаюсь, т.е сперва разыменовываться указатель ptr т.е 107 и далее это значение присваивается переменной r и далее само значение указателя т.е адрес увеличивается на 1. Все так или что-то не то?


Ответы (1 шт):

Автор решения: Harry
int g = 476789;
char *ptr = (char *)&g; // Указатель на младший байт g
int r = (*ptr)++;       // Изменение этого младшего байта 
                        // ПОСЛЕ присвоения его начального 
                        // значения переменной r (ПОСТинкремент)

int r = *ptr + 1;       // Присвоение переменной r увеличенного на 1 
                        // значения по адресу ptr

Значение ptr при этом не меняется. Вот, посмотрите на этот код и результаты его работы:

int main(void)
{
    int g = 476789;
    char *ptr = (char *)&g;
    int r = *ptr + 1;
 
    printf("r = %d, g = %d, ptr = %p\n", r,g,ptr); 
 
    r = (*ptr)++;
    printf("r = %d, g = %d, ptr = %p\n", r,g,ptr); 
 
}

Результат:

r = 118, g = 476789, ptr = 0x7ffc73bbb804
r = 117, g = 476790, ptr = 0x7ffc73bbb804

Советую еще раз перечитать, что такое префиксный и постфиксный инкременты.

→ Ссылка