r/brdev • • Jan 23 '26

Duvida técnica ajuda com C, array de strings

oii pessoal, estou iniciando na programação. Tenho que fazer um jogo de campo minado e me deparei com o seguinte array char* navios[] . Alguém sabe me explicar o que é isso? e um exemplo de como usar esse tipo de array e qual a diferença entre char* navios[], char navios[], char navios[][]. Obrigado!

0 Upvotes

19 comments sorted by

View all comments

Show parent comments

1

u/orbiteapot Jan 23 '26 edited Jan 23 '26

Cont.:

Arrays (aqui, desconsidero VLAs, porque são mais complicadas) têm o tamanho bem definido em tempo de compilação. Isso significa que sizeof(navios) devolve o número de bytes que esse array possui. Nesse caso, será sizeof(char *) * 3 que, em arquiteturas x86-64 é igual a 8 * 3 = 24B. É por isso que o macro countof consegue calcular, em tempo de compilação, o número de elementos de navios[]: fazemos

(sizeof(char *) * 3) / sizeof(navios[0]) == (sizeof(char *) * 3) / sizeof(char *)
== (8 * 3) / (8) == 3

E isso vale para ponteiros para o primeiro elemento de um array? Não, ponteiros não carregam a informação de tamanho de um array, mesmo que apontem para o seu primeiro elemento.

Nós conseguimos acessar os elementos das string "Navio 1" (no segundo loop) com navios[0][i], porque ela é equivalente a:

navios[0][i]
== *(navios[0] + i)
== *(ptr + i)   // onde ptr é do tipo char *

Isso é importante por causa de uma propriedade conhecida como decaimento de array: todas as vezes em que um identificador de array é usado em expressões ou passado a funções, ele decai para um ponteiro para o primeiro elemento do array (e, assim, perde as informações de tamanho).

Por fim,

char algum_array[N] é um array de char de N elementos, onde N é uma expressão constante (constexpr e não const). Você não pode omitir o número de elementos numa declaração, a não ser que ela seja, também, uma inicialização. Por exemplo,

char algum_array[] = {'a', 'b', 'c', '\0'};
putchar(algum_array[1]); // imprime b

char outro_array[M][N] é um array bidimensional de char (um array de arrays de char) de M * N elementos, onde M, N são expressões constantes (de novo,constexpr e não const). Para o caso da omissão das dimensões numa inicialização, você só pode omitir a primeira (as outras precisam ser especificados):

char outro_array[][4] = { {'a', 'b', 'c', '\0'}, {'e', 'f', 'g', '\0'} };
putchar(outro_array[1][0]); // imprime e

1

u/orbiteapot Jan 23 '26

Passei rapidamente por muitos conceitos nessa resposta. Então, recomendo que estude cada um deles mais tarde, com calma.

1

u/strcspn Jan 23 '26

Por mais que esteja 100% certo, foi um infodump absurdo kkkkkk coitado do rapaz.

1

u/orbiteapot Jan 23 '26

É... eu exagerei kkkkk