Q:

Ponteiro para char no printf() não funciona

Resolvi fazer esse código simples, onde tenho um vetor vazio e uma função que preenche ele apenas com uma letra que o usuário digitar, mas não estou conseguindo imprimir.
Se uso aquele printf() comentado, ele funciona, mas se imprimo fora não da nada. E se tento imprimir la na função main(), sai com m 2 no final. Por que?
#include <stdio.h>
#include <string.h>
#define TAM 3

void preencher(char *str, char letra){
    int c;

    for (c=0; c<TAM; c++){
        *str = letra;
        //printf("%c", *str);
        *str++;
    }

    while (*str) printf("%c", str++);
}

int main(){
    char str[TAM], letra;

    scanf("%c", &letra);

    preencher(&str, letra);
}

A:

Tem vários erros neste código. Está passando um array por referência, sendo que todo array já é uma referência.
Se vai usar uma variável para andar pelo array, use-a em vez de acessar o ponteiro direto. Se vai acessar o ponteiro não crie uma variável. Mas eu criaria a variável porque andar pelo array sem copiar seu endereço fará o apontamento original mudar de posição e terá problemas posteriores, que é o principal problema que não consegue usar depois.
Não está colocando o terminador que toda string precisa (imagino que esteja querendo criar uma string.
Para imprimir nem precisa fazer nada além de chamar a função de impressão como string. Se quiser fazer na mão, é o mesmo código do preenchimento, só que faz a impressão.
Assim funciona:
#include <stdio.h>
#define TAM 3

void preencher(char *str, char letra) {
    for (int c = 0; c < TAM - 1; c++) str[c] = letra;
    str[TAM - 1] = 0;
    printf("%s", str);
}

int main(){
    char str[TAM], letra;
    scanf("%c", &letra);
    preencher(str, letra);
}

Veja funcionando no ideone. E no repl.it. Também coloquei no GitHub para referência futura.
Tem maneiras melhores de fazer isso.

