1
resposta

Parenteses no ponteiro

Porque ao utilizar o ponteiro "valor" dentro da função printf e do incremento com ++ eu preciso de um parênteses? Ex: (*valor)

#include <stdio.h>

void calcula(int *valor) {
    printf("calcula %d %d\n", (*valor), valor);
    (*valor)++
    printf("calcula %d %d\n", (*valor), valor);

}

int main() {
    int valor = 10;

    printf("calcula %d %d\n", (*valor), valor);
    calcula(&valor);
    printf("calcula %d %d\n", (*valor), valor);

}
1 resposta

Olá Leonardo, tudo certo?

O operador de incremento ++ é executado antes do operador de dereferencia * , devido às precedências entre operadores. Caso o parênteses seja removido, você estará primeiro incrementando a memória apontada pelo ponteiro, para depois dereferenciá-la. Com o parênteses, primeiro o ponteiro vai ser dereferenciado, para depois o valor ser incrementado.

// primeiro dereferencia o ponteiro, depois incrementa o valor:
(*valor)++ == (10) + 1 == 11;
// primeiro incrementa a memória apontada pelo ponteiro, depois dereferencia:
*valor++ == *(valor++);

No caso do printf, creio não ser necessário o uso do parênteses, pode por direto *valor.

PS: Provavelmente vai ver um erro ao compilar os printf da função main, pois, na main, valor é um int, não um ponteiro. Portanto, não tem como dereferenciar *valor.

Abraço