Проблемы с пониманием операций с указателями

Я не могу точно понять, что делает язык, когда я пишу

*(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 до увеличения разыменовывается.

Другие вопросы по тегам