
paulo1205
(usa Ubuntu)
Enviado em 24/02/2012 - 19:36h
1º) Onde e como é feita a leitura(entrada de dados) para o argc&argv.. é ultilizado Scanf? Arquivo .txt?
O sistema operacional, ao carregar um programa na memória para iniciar sua execução, reserva uma área de memória e coloca nela os argumentos passados ao programa (leia sobre a chamada
execve()).
2º) Em relação a o ponteiro para uma matriz de Strings *argv[].. para onde este ponteiro realmente aponta? que matriz seria essa? algum local indefinido na memoria :@ ?
Cuidado com os nomes: formalmente falando, C não tem strings propriamente ditas. Nem matrizes.
Na declaração
char *argv[]
o símbolo
argv denota um "array de ponteiros para caracteres" (algumas pessoas traduzem "array" como "vetor").
Como C não tem strings como tipo específico, usa-se a convenção de representar strings como uma sequência contígua de caracteres que tem, ao final, um byte com valor nulo, e o acesso a tal sequência de caracteres é dado por um ponteiro que aponta para o primeiro caráter da sequência.
Desse modo,
argv fica sendo um array em que cada elemento contém o endereço de uma posição de memória na qual o sistema operacional dispôs o primeiro caráter dos argumentos passados à chamada
execve() que disparou a execução do programa.
3º) Em relação ao code na declaração das variáveis existe um ponteiro *nome_mes[] que reçebe os respectivos dias do mês.. mais para onde esse ponteiro aponta? eu pensei que usar ponteiros sem aponta-lo para algum lugar não seria uma coisa tão legal..
Cada elemento do array
nome_mes é um ponteiro que aponta para a posição na memória do primeiro caráter do nome do respectivo mês.
4º) No primeiro else do code é utilizado nome_mes[mes-1] para especificar o mes.. mais o nome_mes é um ponteiro nao deveria ser *nome_mes[mes-1] ou nao tem nenhum problema em relação a isso?
Se você fizesse isso, deixaria de ter um ponteiro para o primeiro caráter (que é a notação para acesso à sequência de caracteres da string convencionada) e passaria a ter o próprio primeiro caráter.
Pense da seguinte forma: o operador unário "
*" pode ser lido exatamente como "conteúdo da posição de memória". Desse modo, do mesmo modo como a declaração
int i;
pode ser lida como "
i é do tipo
int", uma declaração tal como
int *ptr_int;
pode ser lida como a informar que "o conteúdo da posição de memória
ptr_int é do tipo
int".
O mesmo sentido ocorre em expressões em que o ponteiro aparece precedido pelo operador "
*". Usando os mesmos nomes dos exemplos acima, as expressões
a = 5 * i;
b = 5 * *ptr_int;
podem ser lidas, respectivamente, como "
a recebe 5 vezes o valor de
i" e "
b recebe 5 vezes o valor do conteúdo da posição de memória
ptr_int".