Il problema non è circa argv
è speciale, ma sulla funzione passaggio degli argomenti. Prova questo programma:
#include<stdio.h>
void foo(int a[])
{
int b[10];
printf("foo :%p %p\n",a,&a);
printf("foo :%p %p\n",b,&b);
}
int main(int argc, char* argv[])
{
int a[10];
printf("main:%p %p\n", a, &a);
foo(a);
return 0;
}
L'uscita nella mia macchina:
main:0x7fffb4ded680 0x7fffb4ded680
foo :0x7fffb4ded680 0x7fffb4ded628
foo :0x7fffb4ded630 0x7fffb4ded630
La prima e la terza linea non è sorprendente dal momento che per una serie arr
, arr
e &arr
hanno lo stesso valore. La seconda linea deve essere spiegata.
Come si può vedere, quando a
viene passato nella funzione foo
, il valore di a
non è cambiato, ma l'indirizzo &a
è cambiato dal momento che le funzioni C passano sempre argomenti per valore, ci sarà una copia locale dell'argomento all'interno della funzione.
È lo stesso con argv
poiché è solo un argomento nella funzione main
.
EDIT: Per chi non è d'accordo con me, la mia risposta non è contro l'altra risposta. Al contrario, si completano a vicenda. argv
è un puntatore esattamente perché è un array passato come argomento di funzione e "decaduto" in un puntatore. Anche in questo caso, argv
non è speciale, non si comporta in modo diverso dagli altri array che vengono passati come argomento di funzione, questo è l'intero punto del mio codice di esempio.
fonte
2013-08-21 07:37:50
printf ("% d% d", a, &a); qui & a e a punterà allo stesso indirizzo ... quindi non è necessario stamparli entrambi e utilizzare% p anziché% d per stampare l'indirizzo. – sunny1304
Penso che questo sia perché il puntatore argv è inizializzato ma il tuo puntatore non è così ha lo stesso indirizzo – Saxtheowl