Oi, Gabriel!
Não sei se consegui entender muito bem a sua pergunta, proponho usarmos os nomes das variáveis e as linhas do código para afinar nossa comunicação, ok?
Você está se referindo à variável tentativa, na linha 16, que define a posição da letra do chute ser diferente da variável j, que é a posição da letra do chute na linha 37?
O motivo é porque em C não existe o tipo de variável string e para trabalhar com cadeia de caracteres nesta linguagem usamos os arrays, que nessa linguagem funcionam como ponteiros.
Quando você passa o array chutes como parâmetro para a função chuta na linha 50, o que você está fazendo na verdade é passar um ponteiro para o primeiro elemento do array chutes.
Por funcionar com um ponteiro, você consegue acessar a string chutes na função chuta e atribuir um valor a uma determinada posição de chutes na linha 16. Então na primeira vez que você roda o seu programa, como a variável tentativa assume o valor 0 e você passou o array (string) chutes e a variável tentativa para a sua função chuta, essa função, ao receber chutes e a variável tentativa com valor 0, armazena a letra escolhida pelo usuário na posição 0 de chutes.
Ex: Na definição das variáveis da sua main(), chutes[26] é uma string sem nada dentro, mas depois que a função chuta é chamada na primeira vez e o chute do usuário é B, na linha 16 o valor (B) é armazenado na posição 0 da string chutes, então a string passa a ser:
B _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Segue abaixo uma ideia de como seria:
Como falamos antes, não existe string em C, então as strings são arrays de caracteres, que por sua vez, para essa linguagem, funcionam como ponteiros. Por funcionar como ponteiro, todas as atribuições de valores em uma determinada posição que você fizer na função chuta, também serão "enxergadas" pela main(), pois quando você modifica o array chutes dentro da função chuta(), você está alterando o mesmo bloco de memória que o array declarado na sua main() está usando.
Sendo assim, quando você modifica o array chutes dentro da função chuta(), essas alterações são refletidas no array chutes na função main(). Isso acontece porque a função chuta() recebe o endereço de memória do array chutes, e qualquer alteração feita nesse endereço vai refletir globalmente e não apenas dentro de uma função específica.
(Esse assunto pode ser melhor compreendido estudando sobre ponteiros e arrays em C)
No seu programa a função chuta() está recebendo o array chutes como um parâmetro e, ao adicionar a letra na posição tentativa, está atualizando o array original que foi passado para ela.
Resumindo, a variável chutes dentro da função main() e a variável chutes dentro da função chuta() estão referenciando o mesmo bloco de memória. Por isso, as alterações feitas em uma função refletem na outra.
Se não for isso, me sinaliza os nomes das variáveis e as linhas, por favor. Se preferir, também estou disponível no Discord da Alura como Thati Moreira para entrar em chamada de voz, onde podemos compartilhar tela, estudar algum assunto específico, etc.
(uma dica: posta o código aqui no texto copiando ele do seu programa e colando aqui na caixa de texto dentro dos acentos que vão aparecer na tela depois que você clicar na ferramenta </> disponível na barra de edição. Assim, quem for analisar pode copiar o códido e colar em editor de texto/IDE de sua preferência. Quando se cola o print, é preciso digitar todo o código. Às vezes até a forma de escrever o código, indentação que cada um usa, dificulta a compreensão e quando se pode copiar, cada um faz seus ajustes)
.
.
.
Se esta resposta te ajudou, favor marcar como solucionado ✓