exibe a 3a string da matriz.Vejamos um codigo para exemplificar isto.#include <stdio.h>#include <stdlib.h>const int QTDSTR = 5;const int COMPRIMENTO = 30; void preenche_matrstr(char matriz[][30]); int main (){ char matrstr [5][30]; int i, opcao; preenche_matrstr(matrstr); do{ printf("Escolha uma das opcao abaixo:\n\n"); printf("1. Exibir posicoes pares\n"); printf("2. Exibir posicoes impares\n"); printf("3. Sair\n\nopcao: "); scanf("%d", &opcao); switch(opcao){ case 1: for(i = 0; i < QTDSTR; i++) if(!((i+1)%2)) printf("palavra %d: %s\n", i+1, matrstr[i]); break; case 2: for(i = 0; i < QTDSTR; i++) if((i+1)%2) printf("palavra %d: %s\n", i+1, matrstr[i]); break; case 3: break; default: printf("OPCAO INVALIDA!!! Digite novamente.\n"); } system("pause"); system("cls"); }while(opcao != 3);} void preenche_matrstr(char matriz[][30]){ int i; printf("PREENCHENDO UMA MATRIZ DE STRINGS:\n\n"); for(i = 0; i < QTDSTR; i++){ printf ("Digite uma palavra para a posicao %d: ", i+1); gets(matriz[i]); } system("cls");} Este codigo preenche uma matriz de strings com palavras digitadas pelo usuario, e depois apresenta um menu onde ele escolhe se deseja ver as palavras nas posicoes pares ou impares.As matrizes de strings sao conceitos muito simples. Mas que podem ficar muito complicados se incluirmos ponteiros na brincadeira.Ponteiros x MatrizesVoce deve lembrar de quando apresentei o conceito de matriz (aqui), como sendo um vetor de vetores.Tambem deve estar lembrado sobre a forma como alocamos um vetor dinamicamente usando a funcao malloc e um ponteiro (aqui). Portanto, a declaracao de um vetor com o comando abaixo e muito comum: char* str;E o que voce diria ao se deparar com a declaracao abaixo: char** matrstr;Ela assusta no inicio. Mas depois que conhecemos o seu significado fica facil (assim eu espero rsrs).Apontando para quem ja esta apontandoO comando acima declara um ponteiro para um ponteiro de char (???). Antes que voce pense que usando ele estamos declarando uma matriz, eu ja quero deixar bem claro que nao. O comando acima nao declara uma matriz.Observe o codigo abaixo:#include <stdio.h>#include <stdlib.h> int main(){ char** matriz; char matrstr[5][30]; printf("O tamanho de char* matriz eh %d.\n", sizeof(matriz)); printf("O tamanho de char matrstr[1][1] eh %d.\n", sizeof(matrstr)); system("pause");}Como demonstrado no codigo acima, ao receber uma declaracao de um ponteiro para ponteiro (ou mesmo um ponteiro simples), o compilador reversa espaco para armazenar um endereco (aqui na minha maquina esse espaco e de 4 bytes). Ja quando recebe a declaracao de uma matriz, ele reserva espaco para toda a matriz. Neste caso especificamente, sao reservados 150 bytes.Mas, assim como podemos tratar um endereco para um bloco de memoria como um vetor, podemos fazer o mesmo com uma matriz, como inclusive ja vimos na 2a parte desta serie. (A diferenca no post de hoje e que vamos expandir um pouco mais o conceito.)Para isso, devemos alocar dinamicamente um bloco de memoria com tamanho suficiente para armazenar nossa matriz inteira, e depois alocar, dentro deste bloco, os espacos para conter cada 'linha' da nossa matriz individualmente.Vamos ao codigo: #include <stdio.h>#include <stdlib.h> char** preenche_matrstr(int*, int*); int main (){ char **matrstr; int qtdstr, tamanho, i, opcao; matrstr = preenche_matrstr(&qtdstr, &tamanho); do{ printf("Escolha uma das opcao abaixo:\n\n"); printf("1. Exibir posicoes pares\n"); printf("2. Exibir posicoes impares\n"); printf("3. Sair\n\nopcao: "); scanf("%d", &opcao); switch(opcao){ case 1: for(i = 0; i