Проблемы с пониманием операций с указателями
Я не могу точно понять, что делает язык, когда я пишу
*(t++)
*t++
когда t
такое указатель?
2 ответа
Эти два выражения
*(t++)
*t++
эквивалентны из-за приоритета оператора.
Таким образом, постфиксный оператор ++ имеет более высокий приоритет, чем унарный оператор *.
Результатом постфиксного оператора ++ является значение его операнда перед приращением.
Из стандарта C (6.5.2.4 Постфиксные операторы увеличения и уменьшения)
2 Результатом оператора postfix ++ является значение операнда. Как побочный эффект, значение объекта операнда увеличивается (то есть к нему добавляется значение 1 соответствующего типа)....
Примите во внимание, что из-за арифметики указателя, если у вас есть такой указатель
T *p;
где T
какой-то тип тогда после операции p++
конечное значение самого указателя увеличивается на величину sizeof( T )
, Для типа char sizeof( char )
всегда равно 1
,
Рассмотрим следующую демонстрационную программу.
#include <stdio.h>
int main(void)
{
char *t = "AB";
printf( "%c\n", *t++ );
printf( "%c\n", *t );
return 0;
}
Его вывод
A
B
Вы можете заменить это утверждение
printf( "%c\n", *t++ );
за это утверждение
printf( "%c\n", *( t++ ) );
и вы получите тот же результат.
На самом деле это выражение
*(t++)
также эквивалентно выражению
t++[0]
Оба выражения эквивалентны.
Постфиксный оператор приращения ++
имеет более высокий приоритет, чем оператор разыменования *
, В следствии *(t++)
а также *t++
сделать то же самое. А именно указатель t
увеличивается, и первоначальное значение t
до увеличения разыменовывается.