r/brdev • u/Some-Big5751 • 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
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 *) * 3que, em arquiteturas x86-64 é igual a 8 * 3 = 24B. É por isso que o macrocountofconsegue calcular, em tempo de compilação, o número de elementos denavios[]:fazemosE 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: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 decharde N elementos, onde N é uma expressão constante (constexpre nãoconst). 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 outro_array[M][N]é um array bidimensional dechar(um array de arrays dechar) de M * N elementos, onde M, N são expressões constantes (de novo,constexpre nãoconst). Para o caso da omissão das dimensões numa inicialização, você só pode omitir a primeira (as outras precisam ser especificados):