Какая разница между конструкциями *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 шт):
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
Советую еще раз перечитать, что такое префиксный и постфиксный инкременты.