char** argv

P2
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 7 lat
  • Postów:19
0

Witam, przyznaję szczerze, że nie rozumiem pewnej rzeczy i będę bardzo wdzięczny za wytłumaczenie. Chodzi o dostęp do argumentów przekazywanych do programu.
Patrząc w internet robi się to takim sposobem:

Kopiuj
#include <stdio.h>
int main( int argc, char ** argv ) {
    printf( "argc = %d\n", argc );
    for( int i = 0; i < argc; ++i ) {
        printf( "argv[ %d ] = %s\n", i, argv[ i ] ); //Dostęp jak do jednowymiarowej tablicy, dlaczego ?
    }
}

Tutaj robie w zasadzie to samo tyle, że definiuje wskażnik na wskażnik do inta. Dlaczego dostęp do danych odbywa się w inny sposób niż do argumentów przekazywanych do programu ?
W pierwszym przypadku mam char** a w drugim```
int**

Kopiuj
```c
int main(int argc, char *argv[])
{
    int** x;

    x = malloc(4 * sizeof(int*));
    for (int i = 0; i < 4; i++) {
      x[i] = malloc(4 * sizeof(int));
    }
    for(int i = 0; i < 4; i++)
    {
        for(int j =0; j < 4; j++)
        {
            x[i][j] = 47;
        }
    }
    printf("value=%d",x[0][0]); // OK
printf("value=%d",x[0]); // NOK
    return 0;
}
edytowany 2x, ostatnio: pele2525
kaczus
  • Rejestracja:około 10 lat
  • Ostatnio:5 dni
  • Lokalizacja:Łódź
  • Postów:1402
1

W pierwszym przypadku masz dostęp do tablicy wskaźników, alementem jest wskaźnik na ciąg znakowy, który wyświetlasz... możesz sobie wyświetlić

Kopiuj
for( int i = 0; i < argc; ++i ) 
{
    for(int j = 0; argv[i][j]; ++j) 
        printf( "argv[ %d ][x] = %c", i, argv[ i ][j] );
 printf("\n");
}
bedzie to to samo, ale bedziesz mial wyswietlone tak jak chcesz z wykorzystaniem dwuelementowej tablicy

Ogólnie na prace domowe mam stawki zaporowe. Czasem coś o programowaniu znajdzie się na mojej stronie
edytowany 1x, ostatnio: kaczus
stryku
a tyle sie na kom produkowałem
twonek
nie powinno być %c zamiast %s?
kaczus
@twonek racja - tak to jest jak pisze z glowy czyli z niczego i nie sprawdze :)
stryku
  • Rejestracja:ponad 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:607
2

W piewszym przypadku dobierasz sie do jednowymiarowej tablicy charow, czyli po prostu do napisu, bo tak dzialaja c-style stringi. Są to tablicę charow zakonczone znakiem \0. w printfie podajesz format %s, wiec bedzie on oczekiwal właśnie wskaźnika na tablicę charow.

W drugim przypadku podajesz %d, wiec printf bedzie oczekiwal zmiennej całkowitej, a x[0] jest wskaźnikiem na zmienną (tu tablicę zmiennych) całkowitych. Dlatego wychodzi lipa.
Printf nie wie co robić ze wskaźnikami na coś innego niz char (upraszczajac)

P2
Dzięki, teraz już jasne ;-)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.