Problem nie polega na argv
jest wyjątkowy, ale o funkcji przejścia argumentów. Wypróbuj ten program:
#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;
}
produkcja w moim komputerze:
main:0x7fffb4ded680 0x7fffb4ded680
foo :0x7fffb4ded680 0x7fffb4ded628
foo :0x7fffb4ded630 0x7fffb4ded630
Pierwsza i trzecia linia nie jest zaskakujące, ponieważ na tablicy arr
, arr
i &arr
mają taką samą wartość. Druga linia musi być wyjaśniona.
Jak widać, gdy a
jest przekazywana w funkcji foo
wartość a
się nie zmieniło, ale adres &a
się zmieniło od funkcji C zawsze przekazywać argumenty przez wartość, nie będzie lokalna kopia argumentu wewnątrz funkcji.
To samo dotyczy argv
, ponieważ jest to tylko argument funkcji main
.
EDIT: Dla tych, którzy nie zgadza się ze mną, moja odpowiedź nie jest w stosunku do drugiej odpowiedzi. Wręcz przeciwnie, uzupełniają się nawzajem. argv
jest wskaźnikiem dokładnie dlatego, że jest tablicą, która została przekazana jako argument funkcji i "zepsuła się" do wskaźnika. Ponownie, argv
nie jest specjalny, działa tak samo jak inne tablice, które są przekazywane jako argument funkcji, to cały punkt mojego przykładu kodu.
printf ("% d% d", a, &a); tutaj & a i a wskaże ten sam adres ... nie musisz więc drukować ich obu, i użyj% p zamiast% d, aby wydrukować adres. – sunny1304
Myślę, że to dlatego, że wskaźnik argv jest inicjowany, ale twój wskaźnik nie jest tak, że dostał ten sam adres – Saxtheowl