2013-05-21 11 views
10

Sono nuovo di programmazione C, ho riscontrato un problema.
In caso di dichiarazioni complicate Ho trovato questoChe cosa significa char * argv [] significa?

int *daytab[13]; // daytab is an array of 13 pointers to int 

che significa daytab è il nome della matrice e il nome dell'array punta al primo elemento della matrice. Il nome dell'array non è compatibile con la manipolazione del puntatore come daytab++ ecc (correggimi se ho torto).

Ma ho trovato questo codice scritto in Dennis Ritchie

main(int argc, char * argv[]) { 
    while(--argc > 0)      
     printf("%s%s",*++argv,(argc>1) > " " : ""); 

    printf("\n"); 
    return 0; 
} 

Come possono manipolare argv? Non è il nome dell'array?

+0

È un puntatore a un array (char) di tutti i parametri passati dal sistema all'applicazione, argc contiene il numero dello stesso –

+0

Nella riga che contiene 'printf' - non dovrebbe essere quest'ultimo() argc> 1)? "": "" '? Il ">" indipendente non sembra essere corretto. A me sembra che si supponga di mettere un vuoto tra gli argomenti mentre stampano, ma non vuoto dopo l'ultimo arg. –

+0

Sono assolutamente scioccato dal fatto che per quattro anni non ci sia alcun riferimento alla [Regola a spirale di clock] (http://c-faq.com/decl/spiral.anderson.html) per interpretare le dichiarazioni di variabili C. Oh, aspetta ... :-) –

risposta

16

Il parametro char * argv[] decadono su un puntatore, char ** argv. Si può altrettanto bene scrivere la firma di funzione per main() come:

int main(int argc, char ** argv) 

Si può fare quello che ti piace con il puntatore argv entro main(), così argv++ ad esempio solo urti argv per puntare a argv[1] piuttosto che argv[0].

argv ---> argv[0] ---> "program" 
      argv[1] ---> "arg1" 
      argv[2] ---> "arg2" 
      ...   ... 
      argv[argc] == NULL 
+0

quindi perché non in caso di char argv [] ?? – akash

+1

char argv [] significherebbe una singola stringa, char * argv [] significa molte stringhe. – Devolus

+1

grazie mille !! fatto !! è perché è un argomento di funzione !! :) – akash

-1

argc e argv sono i parametri passati alla funzione principale del programma.

argc in un numero intero che contiene il numero di parametri e argc è un puntatore a un array di stringhe che contiene i parametri effettivi.

2

La dichiarazione char *argv[] è una matrice (di dimensioni indeterminate) di puntatori a char, in altre parole una matrice di stringhe.

E tutti gli array decadono in puntatori e quindi è possibile utilizzare un array come puntatore (proprio come è possibile utilizzare un puntatore come array). Quindi, *++argv prima aumenta il "puntatore" per puntare alla voce successiva nell'array argv (che la prima volta nel ciclo sarà il primo argomento della riga di comando) e dereferenzia quel puntatore.

-1

Ciò che viene fatto qui è l'aritmetica del puntatore.

Il puntatore non è realmente cambiato.

L'indirizzo del puntatore viene utilizzato, incrementato temporaneamente e quindi utilizzato per l'output.

Poiché l'operatore ++ è posizionato prima dell'argv, l'indirizzo viene prima preso, quindi incrementato e quindi sottoposto a dereferenziazione per ottenere il carattere * dietro questo indirizzo.

Ma non è lo stesso indirizzo, che viene modificato, solo l'offset, da dove verrà letto il printf.

Ok?

+3

Il puntatore molto ** è ** modificato, utilizzando l'operatore di pre-incremento. Ma, sai, questo è C, non un linguaggio informatico da namby-pamby che mira a proteggerci da noi stessi. Vuoi modificare gli argomenti della procedura? Ehi, dai! Siamo C! Siamo tosti! Siamo forti! Siamo (* & # $ (* & (* # ADDRESS EXCEPTION AT MEMORY LOCATION 0 –

+0

Scusate per il ritardo. Ho sempre pensato che questo operatore di preincremento aiuti solo a ottenere il "posto prima" e non cambierebbe veramente il puntatore stesso, cioè, solo per l'accesso durante il runtime. Ok, ho bisogno di leggere ancora una volta, direi (devo ammetterlo). – icbytes

2

All'avvio di un programma, ottiene l'argomento nella funzione principale. Ecco perché scrivi di solito.

int main(int argc, char *argv[]) 

Questo significa semplicemente che argv è un puntatore al maggior numero di stringhe di argomenti come indiciated da argc (== numero di argomenti). Dato che argv decade a char ** argv puoi anche aumentarlo, o altrimenti come un puntatore.

Quindi, se si desidera stampare tutti gli argomenti da linea di comando:

int main(int argc, char *argv[]) 
{ 
    for(int i = 0; i < argc; i++) 
     printf("%s\n", argv[i]); 

    for(int i = 0; i < argc; i++) 
     printf("%s\n", argv++); 

    return 0; 
} 
+0

Nota che questo codice non fa la stessa cosa del codice postato da OP. Nota attentamente l'uso degli operatori di pre-incremento e pre-decremento nel codice originale e l'effetto della precedenza degli operatori. –

2

argv è un array di char*. Fare ++argv significa accedere alla cella successiva dell'array. Il * indica che vogliamo il valore della cella, non l'indirizzo.

2

La dichiarazione dei parametri è simile alla dichiarazione di un array ma di fatto (poiché è un parametro di funzione) non è uno. Lo C FAQ spiega bene.