2011-10-03 14 views
18

podstawie mojego zrozumienia wskaźnik do wskaźnika do tablicy znaków,wskaźnik do wskaźnika z argv

% ./pointer one two 

argv   
+----+   +----+ 
| . | ---> | . | ---> "./pointer\0" 
+----+   +----+ 
       | . | ---> "one\0" 
       +----+ 
       | . | ---> "two\0" 
       +----+ 

Z kodu:

int main(int argc, char **argv) { 
    printf("Value of argv[1]: %s", argv[1]); 
} 

Moje pytanie brzmi: Dlaczego argv [1] do przyjęcia? Dlaczego nie jest to coś w stylu (* argv) [1]?

moje kroki Rozumienie:

  1. Weź ARGV, dereference niego.
  2. Powinno zwrócić adres tablicy wskaźników do znaków.
  3. Używanie arytmetyki wskaźnikowej do dostępu do elementów tablicy.
+3

+1 dla diagramu. :) – Mysticial

Odpowiedz

14

Jest to bardziej wygodne, aby myśleć o [] jako operator dla wskaźników zamiast tablic; jest używany z obydwoma, ale ponieważ tablice ulegają rozpadowi do indeksowania tablic indeksowych, nadal ma sens, jeśli jest to postrzegane w ten sposób. Zasadniczo przesuwa, a następnie dereferencje, wskaźnik.

Tak więc z argv[1], co naprawdę masz, jest *(argv + 1) wyrażone za pomocą wygodniejszej składni. To daje drugie char * w bloku pamięci wskazanym przez argv, ponieważ char * jest typu argv wskazuje na, a [1] przesuwa bajty, a następnie usuwa wynik.

(*argv)[1] byłoby dereference argv pierwszy z * zdobyć pierwszy wskaźnik char, następnie przesunięcie że 1 * sizeof(char) bajtów, a następnie dereferences że dostać char. Daje to drugi znak w pierwszym ciągu grupy ciągów wskazanych przez argv, co oczywiście nie jest tym samym co argv[1].

Pomyśl o indeksowanej zmiennej tablicowej jako o wskaźniku obsługiwanym przez operator "offset, a następnie dereference a wskaźnik".

+0

Tak, wpadłem w chaos, dlaczego nie potrzebowaliśmy derefrence argv, najpierw, ale okazało się, że zapomniałem, że jest równe * (argv + n), gdzie n jest indeksem dolnym. –

10

Ponieważ argv jest wskaźnik do wskaźnika do char wynika, że ​​argv[1] jest wskaźnikiem do char. print() format oczekuje wskaźnika do postaci argumentu i wypisuje tablicę znaków zakończoną znakiem NUL, do której odnosi się argument. Ponieważ argv[1] nie jest wskaźnikiem zerowym, nie ma problemu.

(*argv)[1] jest również ważna C, ale (*argv) jest równoważna argv[0] i jest wskaźnikiem do char, więc (*argv)[1] jest drugi znak argv[0], który jest / w swoim przykładzie.

4

Indeksowanie wskaźnika jako tablicy niejawnie go usuwa. p[0] jest *p, p[1] jest *(p + 1) itp

Powiązane problemy